query array c# linq linq-to-objects

c# - array - Find() frente a Where(). FirstOrDefault()



string linq c# (4)

¿Dónde está el método Find en IEnumerable<T> ? (Pregunta retórica.)

Los métodos Where y FirstOrDefault son aplicables contra múltiples tipos de secuencias, incluidas List<T> , T[] , Collection<T> , etc. Cualquier secuencia que implemente IEnumerable<T> puede usar estos métodos. Find está disponible solo para la List<T> . Los métodos que generalmente son más aplicables, son más reutilizables y tienen un mayor impacto.

Supongo que mi siguiente pregunta sería por qué agregaron el hallazgo. Ese es un buen consejo. Lo único que se me ocurre es que FirstOrDefault podría devolver un valor por defecto distinto de null. De lo contrario, parece una adición sin sentido

Find on List<T> es anterior a los otros métodos. List<T> se agregó con genéricos en .NET 2.0, y Find fue parte de la API para esa clase. Where y FirstOrDefault se agregaron como métodos de extensión para IEnumerable<T> con Linq, que es una versión posterior de .NET. No puedo decir con certeza que si Linq existía con la versión 2.0, Find nunca se habría agregado, pero podría decirse que es el caso de muchas otras características que aparecieron en versiones anteriores de .NET que se volvieron obsoletas o redundantes en versiones posteriores.

A menudo veo a personas que usan Where.FirstOrDefault() hacer una búsqueda y tomar el primer elemento. ¿Por qué no usar Find() ? ¿Hay alguna ventaja para el otro? No podría notar la diferencia.

namespace LinqFindVsWhere { class Program { static void Main(string[] args) { List<string> list = new List<string>(); list.AddRange(new string[] { "item1", "item2", "item3", "item4" }); string item2 = list.Find(x => x == "item2"); Console.WriteLine(item2 == null ? "not found" : "found"); string item3 = list.Where(x => x == "item3").FirstOrDefault(); Console.WriteLine(item3 == null ? "not found" : "found"); Console.ReadKey(); } } }


Existe una diferencia muy importante si el origen de los datos es Entity Framework: Find encontrará entidades en el estado "agregado" que aún no se han conservado, pero Where not not. Esto es por diseño.


Me acabo de enterar hoy, haciendo algunas pruebas en una lista de objetos de 80K y descubrí que Find() puede ser hasta 1000% más rápido que usar un Where con FirstOrDefault() . No lo sabía hasta probar un cronómetro antes y después de cada uno. A veces era el mismo tiempo, de lo contrario, era más rápido.


Find solo se implemented en List<T> , mientras que Where().FirstOrDefault() funciona con todo IEnumerable<T> .