LINQ с пропуском и взятием

Я использовал приведенный ниже код, чтобы взять некоторые элементы из IEnumerable, но он всегда возвращает источник как null и считается как 0, и на самом деле элементы существуют в IEnumerable

private void GetItemsPrice(IEnumerable<Item> items, int customerNumber)
{
    var a = items.Skip(2).Take(5);
}

Когда я пытаюсь получить доступ к a, он имеет счетчик 0. Что-то здесь идет не так?

введите описание изображения здесь


person Community    schedule 13.03.2013    source источник
comment
Сколько элементов в коллекции изначально?   -  person Grant Thomas    schedule 13.03.2013
comment
Нет, у меня есть кое-что еще, но на мой вопрос этого достаточно   -  person    schedule 13.03.2013
comment
Что содержат предметы?   -  person Darren    schedule 13.03.2013
comment
@GrantThomas, он содержит 102 элемента   -  person    schedule 13.03.2013
comment
Что вы имеете в виду, возвращая источник как null? И если a.Count() возвращает 0, то в основном в items было не более 2 элементов. Если вы думаете, что было 102 элемента, я подозреваю, что ваша диагностика неверна.   -  person Jon Skeet    schedule 13.03.2013
comment
@DarrenDavies, это коллекции объектов, которые содержат itemid и itemname   -  person    schedule 13.03.2013
comment
Сторонники голосования не хотят оставлять комментарии, что не так с моим вопросом?   -  person    schedule 13.03.2013
comment
А как выглядит вывод выгрузки items в ближайшее окно?   -  person Jonas Høgh    schedule 13.03.2013
comment
@JonSkeet, пожалуйста, проверьте мое вложение, и оно взято из непосредственного окна   -  person    schedule 13.03.2013
comment
Кажется, вы все еще не перечисляете свою коллекцию. IEnumrables загружаются лениво и не будут делать то, что вы хотите, пока вы им не скажете.   -  person Thomas Lindvall    schedule 13.03.2013
comment
@SSS: На скриншоте нет никаких указаний на то, что items.Count() больше 2.   -  person Jon Skeet    schedule 13.03.2013
comment
@JonSkeet, пожалуйста, проверьте мой обновленный снимок экрана, и я добавил в него счетчик   -  person    schedule 13.03.2013
comment
@SSS: А ... лениберезовский проблему обнаружил. Вот почему вам обычно не следует пытаться интерпретировать ценности частных членов, которых вы не понимаете. Если бы вы позвонили a.Count(), вы бы увидели совсем другое.   -  person Jon Skeet    schedule 13.03.2013


Ответы (1)


Помните, что переменная a в вашем коде является запросом. Это не результат выполнения запроса. Когда вы используете Immediate Window для просмотра запроса (на самом деле это относится к запросам с отложенным выполнением, в противном случае у вас будут результаты вместо запроса), оно всегда будет отображаться

{System.Linq.Enumerable.TakeIterator<int>}
    count: 0
    source: null

Вы можете проверить это с помощью этого кода, который, очевидно, имеет достаточно элементов:

int[] items = { 1, 2, 3, 4, 5, 6, 7 };
var a = items.Skip(2).Take(3);

Итак, вы должны выполнить свой запрос, чтобы увидеть результаты выполнения запроса. Напишите в немедленном окне:

a.ToList()

И вы увидите результаты выполнения запроса:

Count = 3
    [0]: 3
    [1]: 4
    [2]: 5
person Sergey Berezovskiy    schedule 13.03.2013
comment
Это оно. msdn.microsoft.com/en-us/library/bb503062.aspx Немедленное возвращаемое значение - это объект, в котором хранится вся информация, необходимая для выполнения действия. Запрос, представленный этим методом, не выполняется до тех пор, пока объект не будет перечислен либо путем прямого вызова его метода GetEnumerator, либо с помощью foreach - person Xaruth; 13.03.2013
comment
@Xaruth да, это то, что просто называется query: объект, в котором хранится вся информация, необходимая для выполнения действия - person Sergey Berezovskiy; 13.03.2013
comment
Спасибо за пояснение. Мне нужно передать это как параметр items.Skip(2).Take(5) другому методу. Нужно ли мне использовать .ToList() для передачи этого параметра в качестве параметра? - person ; 13.03.2013
comment
Как я отметил в другом комментарии: вот почему вам не следует использовать отладчик, чтобы показывать вам поля, значение которых вы не знаете, а затем предполагать, что вы действительно понимаете значение ... - person Jon Skeet; 13.03.2013
comment
@SSS: Возможно, вы захотите. По-разному. Но вы должны понимать, что единственная причина, по которой вы видите 0, - это то, что вы смотрите на поле, которое является деталью реализации, которую вы обычно не можете наблюдать. Это не длина последовательности. - person Jon Skeet; 13.03.2013
comment
@SSS, как сказал Джон, это зависит от обстоятельств. Если вы вернете a, то запрос будет выполнен вызывающим абонентом позже (это не всегда возможно). Если вы вернете результат выполнения запроса, добавив ToList(), тогда вызывающий будет работать с объектами в памяти (это может быть проблемой, если ваш запрос получает элементы из базы данных). - person Sergey Berezovskiy; 13.03.2013