Пожалуйста, объясните System.Linq.Enumerable.Where (предикат Func <T, int, bool>) - PullRequest
4 голосов
/ 20 июля 2010

Я не могу разобраться в документации MSDN для этой перегрузки метода Where, который принимает предикат с двумя аргументами, где int, предположительно, представляет индекс элемента источника, что бы это ни значило (я думал, чтоenumerable был последовательностью, и вы не могли видеть дальше, чем следующий элемент, а тем более индексировать его.)и как это используется?

Ответы [ 2 ]

6 голосов
/ 20 июля 2010

Параметр int представляет индекс текущего элемента в текущей итерации .Каждый раз, когда вы вызываете один из методов расширения LINQ, вам теоретически не гарантируется, что элементы возвращаются в том же порядке, но вы знаете, что все они возвращаются по одному разу, и поэтому им могут быть назначены индексы.(Ну, вам гарантировано, если вы знаете, что объект запроса List<T> или такой, но не в целом.)

Пример:

var result1 = myEnumerable.Where((item, index) => index < 4);
var result2 = myEnumerable.Take(4);
// result1 and result2 are equivalent.
4 голосов
/ 20 июля 2010

Вы не можете индексировать IEnumerable<T> так же, как массив, но вы можете использовать индекс для фильтрации списка или для индексации некоторых данных в другой коллекции, которая будет используется в состоянии.

РЕДАКТИРОВАТЬ: Например, чтобы пропустить любой другой элемент, который вы можете использовать:

var results = sequence.Where((item, idx) => idx % 2 == 0);
...