Pattern matching in an array or collection
You are unnecessarily looping through the array 3 times (only one loop is required). Its not clear how you will be using the results, but assuming you need to store them, then the code can be simplified to

int[] array = new int[15] { 1, 0, 1, 2, 0, 1, 0, 1, 0, -1, 0, 2, 0, -2, 0 };
// Define 3 lists from the results
List&lt;int&gt; all = new List&lt;int&gt;();
List&lt;int&gt; up = new List&lt;int&gt;();
List&lt;int&gt; down = new List&lt;int&gt;();
// Get the index of the first zero value and add to the lists
int first = Array.IndexOf(array, 0);
all.Add(first);
up.Add(first);
down.Add(first);
// Loop the remaining items in the array and add to the appropriate lists
for (int i = first + 1; i &lt; array.Length; i++)
{
    int current = array[i];
    int previous = array[i - 1];
    if (current != 0)
    {
        continue;
    }
    if (Math.Abs(previous - current) &gt; 1)
    {
        all.Add(i);
        if (previous - current &gt; 1)
        {
            up.Add(i);
        }
        else if (previous - current &lt; 1)
        {
            down.Add(i);
        }
    }
}


The result is

all contains [1, 4, 12, 14], up contains [1, 4, 12] and down contains [1, 14]