В чем разница между FindAll и Select?

1

Я использовал List.Select(condition).Count() и нашел результат неуместным, а затем попробовал List.FindAll(condition).Count() и он работал нормально.

Как работает List.Select (условие).count?

Теги:
linq

5 ответов

4

Вы видите разные результаты, потому что

list.Select(condition)

преобразует список в последовательность значений True и False с длиной, которая всегда равна количеству элементов в list. Если вы используете Where вместо Select, вы получите соответствующие результаты.

Однако более короткий способ получить результат - передать условие Count, например:

var res = list.Count(condition);
2

List.Select Вызывает функцию преобразования для каждого элемента в последовательности и возвращает преобразованную коллекцию. В общем случае использование этого будет возвращать тот же Count что и исходная коллекция.

List.FindAll принимает предикат (похожий на List.Where), и поэтому будет возвращать только те элементы, которые соответствуют ему, давая разные значения из оригинала.

2

Ваш код или способ отфильтровать список в корне неверны. То, что вы пытаетесь сделать, это:

 list.Select(mylist => mylist.key == "somevalue").Count();

Это вернет тот же счет, что и длина списка. Получаемая коллекция будет true/false для каждого элемента.

Вам нужно Enumerable.Where like:

 list.Select(mylist => mylist.key == "somevalue").Count();

Это даст вам тот же счет, что и в методе FindAll.

Вы даже можете передать предикат Count:

var count = list.Count(mylist => mylist.Key == "somevalue");

FindAll отличается от Enumerable.Where так, что FindAll создает новый список, тогда как Enumerable.Where возвращает IEnumerable<T>. Вы можете прочитать этот вопрос для получения дополнительной информации: С# FindAll VS Where Speed

1

Использование Select выполняет операцию сопоставления, а не операцию фильтрации. Это означает, что вы всегда получите такое же количество элементов из запроса, как и в исходном списке. В вашем случае вы проецировали список из List<T> в IEnumerable<bool> (с исходным числом истинных или ложных ответов).

Используйте. .Where фильтровать список.

0

Эта строка:

List.select(mylist => mylist.key == "somevalue")

создает список значений "true" и "false", но не фильтрует выход. Поэтому счетчик такой же, как и без выбора.

List.select(mylist => mylist.key == "somevalue").count() 

такой же как

List.count();

А также

List.where(mylist => mylist.key == "somevalue").count()

работает так, как вы хотите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню