Я использовал List.Select(condition).Count()
и нашел результат неуместным, а затем попробовал List.FindAll(condition).Count()
и он работал нормально.
Как работает List.Select (условие).count?
Вы видите разные результаты, потому что
list.Select(condition)
преобразует список в последовательность значений True
и False
с длиной, которая всегда равна количеству элементов в list
. Если вы используете Where
вместо Select
, вы получите соответствующие результаты.
Однако более короткий способ получить результат - передать условие Count
, например:
var res = list.Count(condition);
List.Select
Вызывает функцию преобразования для каждого элемента в последовательности и возвращает преобразованную коллекцию. В общем случае использование этого будет возвращать тот же Count
что и исходная коллекция.
List.FindAll
принимает предикат (похожий на List.Where
), и поэтому будет возвращать только те элементы, которые соответствуют ему, давая разные значения из оригинала.
Ваш код или способ отфильтровать список в корне неверны. То, что вы пытаетесь сделать, это:
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
Использование Select
выполняет операцию сопоставления, а не операцию фильтрации. Это означает, что вы всегда получите такое же количество элементов из запроса, как и в исходном списке. В вашем случае вы проецировали список из List<T>
в IEnumerable<bool>
(с исходным числом истинных или ложных ответов).
Используйте. .Where
фильтровать список.
Эта строка:
List.select(mylist => mylist.key == "somevalue")
создает список значений "true" и "false", но не фильтрует выход. Поэтому счетчик такой же, как и без выбора.
List.select(mylist => mylist.key == "somevalue").count()
такой же как
List.count();
А также
List.where(mylist => mylist.key == "somevalue").count()
работает так, как вы хотите.