Линк двусмысленность о том, где и выберите - PullRequest
8 голосов
/ 16 ноября 2011

Сегодня я столкнулся с проблемой с LINQ для объектов (не SQL), которая возникла из-за опечатки. У меня было .Select в одном месте и .Where в другом месте. Я ожидал того же результата, но они показывают разные цифры. Предположим, что somelist имеет 10 элементов, причем все элементы имеют qty = 0

//returns 10 - basically count of all rows. I am expecting 0
 somelist.Select(p => p.qty > 0).Count() 

//returns 0 - the correct count
 somelist.Where(p => p.qty > 0).Count() 

если оба выбирают и где возвращают IEnumerable<T>, тогда почему двусмысленность? Спасибо.

Ответы [ 4 ]

18 голосов
/ 16 ноября 2011

Select - это проекция, поэтому вы получите выражение p.qty > 0, вычисленное для каждого элемента в somelist. то есть много значений true / false (тот же номер, что и в исходном списке). Поэтому, когда вы наберете Count, вы получите тот же номер. Если вы посмотрите, выбор вернет IEnumerable<bool> (потому что тип p.qty > 0 - это bool).

Where фильтрует результаты, поэтому подсчет выполняется в отфильтрованном списке и дает ожидаемые результаты. Тип этого IEnumerable<TypeOfElementInOriginalList>.

Обратите внимание, что вы также можете сделать: somelist.Count(p => p.qty > 0), потому что Count имеет перегрузку , которая принимает предикат для фильтрации.

2 голосов
/ 16 ноября 2011

Первый запрос выдает то же самое, что и somelist.Count().Это просто количество элементов в последовательности.Вызов Select проецирует каждый объект, но количество объектов остается неизменным.

Второй запрос дает количество элементов, которые выполняют предикат, что является потенциально меньшим числом,Вызов Where фильтрует объекты из последовательности.

0 голосов
/ 16 ноября 2011

Первый оператор создает IEnumerable bools: это поле qty> 0. Поскольку имеется 10 записей, вы получите 10 bools.

Второй возвращает IEnumerable, отфильтрованный по условию.

0 голосов
/ 16 ноября 2011

Первый запрос возвращает IEnumerable из логических значений.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...