EDIT
This answer makes the following assumptions:
So with this assumptions:
The query uses the following overload of the Where method:
public static System.Collections.Generic.IEnumerable<TSource> Where<TSource> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,int,bool> predicate);
where predicate is a Func<TSource,Int32,Boolean>
So it takes as a parameter a predicate, using both the current value and the index of the element of the collection which is enumerated.
A predicate is simply a function that returns a boolean, to be used for condition checking.
The following Linq query
numbers = numbers.Where((e, i) => predicate(e, i)).ToArray();
can be replaced by:
var result = new List<int>();
for (int i = 0; i < numbers.Length; i++)
{
if( predicate(numbers[i], i) )
{
result.Add(numbers[i]);
}
}
numbers = result.ToArray();
Indeed, when materialized, the Where query will do just that: take each element one by one, and check via a predicate if the element (and in this case its index) should be added to the newly constructed collection.
So in this specific case, the query would become:
var result = new List<int>();
for (int i = 0; i < numbers.Length; i++)
{
if( i != 0 )
{
result.Add(numbers[i]);
}
}
numbers = result.ToArray();
In this example, the predicate just uses the index, but generally it could use both the index and the current value.