Linq & Boolean Function - PullRequest
       4

Linq & Boolean Function

5 голосов
/ 28 августа 2011

Есть ли способ применить функцию с подписью

bool IsOdd(int number);

в массив целых чисел и вернуть, является ли любое заданное целое число в этом массиве нечетным в одной инструкции? Я знаю, что могу использовать

return (array.Where(IsOdd).Count() > 0);

но это подразумевает вызов двух методов и сравнение ... Неужели нет более короткого способа достичь того же самого?

1 Ответ

17 голосов
/ 28 августа 2011

Да.

Для начала вы можете использовать форму Count, которая принимает предикат:

return array.Count(IsOdd) > 0;

... но ты не хочешь этого делать. Этот код все еще выражает численное сравнение, которое не является необходимым. Вы хотите спросить, является ли любой элемент в массиве нечетным . Другими словами:

return array.Any(IsOdd);

Это не только более выразительно, но и потенциально гораздо быстрее . Как только Any найдет совпадение, он вернет true - тогда как Count придется перебрать массив целом , чтобы точно определить, сколько совпадений есть.

По сути, всякий раз, когда вы видите запрос LINQ, использующий Count() > 0, вам следует подумать об использовании Any. В некоторых случаях с запросами на основе дерева выражений, такими как LINQ to SQL, это может не иметь значения для производительности (, если оптимизатор запросов имеет видимость сравнения с 0), но в LINQ to Objects это, безусловно, может.

...