Función Linq y booleana

¿Hay alguna forma en que se pueda aplicar una función con firma?

bool IsOdd(int number);

a una matriz de enteros y devuelve si algún entero dado en esa matriz es impar en una sola instrucción? Se que puedo usar

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

pero eso implica llamar a dos métodos y hacer una comparación ... ¿No hay realmente una forma más corta de lograr lo mismo?

preguntado el 27 de agosto de 11 a las 20:08

1 Respuestas

Sí.

Para empezar, puede utilizar la forma de Count que toma un predicado:

return array.Count(IsOdd) > 0;

... pero no quieres hacer eso. Ese código todavía expresa una comparación numérica que es innecesaria. Quieres preguntar si cualquier elemento en la matriz es impar. En otras palabras:

return array.Any(IsOdd);

Esto no solo es más expresivo, también es potencialmente mucho mas rápido. Tan pronto como Any encuentra una coincidencia, volverá true - mientras que Count tendría que iterar sobre el todo array para averiguar exactamente cuántas coincidencias hay.

Básicamente, siempre que vea una consulta LINQ usando Count() > 0 deberías pensar en usar Any en lugar de. En algunos casos, con consultas basadas en árboles de expresión, como LINQ to SQL, es posible que no suponga una diferencia de rendimiento (if el optimizador de consultas tiene visibilidad de la comparación con 0) pero en LINQ to Objects ciertamente puede hacerlo.

Respondido 28 ago 11, 10:08

@Jon: Mientras eso Count() > 0 la parte en sí está dentro de una consulta LINQ, LINQ to SQL puede optimizarla, pero si está escribiendo if (col.Count() > 0), LINQ to SQL hará el recuento por usted, ya que obviamente no hay forma de que LINQ to SQL y C # trabajen juntos para optimizar esto para usted. Entonces, incluso con LINQ to SQL (o cualquier O / RM) puede marcar la diferencia. - Steven

Sin mencionar que array.Any(IsOdd) es lo más parecido al inglés real en los lenguajes de programación. - usuario180326

Además, algunos ORMS (incluido LINQ to SQL) traducen Any a Exsists, que tiene el mismo comportamiento de cortocircuito que Any en LINQ to Objects. - Jim Wooley

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.