Возможный дубликат:
Найти() vs. Where(). FirstOrDefault()
Получил интересный результат для поиска Дианы в большой последовательности простого ссылочного типа, имеющего однострочное свойство.
Stopwatch watch = new Stopwatch();
string diana = "Diana";
while (Console.ReadKey().Key != ConsoleKey.Escape)
{
//Armour with 1000k++ customers. Wow, should be a product with a great success! :)
var customers = (from i in Enumerable.Range(0, 1000000)
select new Customer
{
Name = Guid.NewGuid().ToString()
}).ToList();
customers.Insert(999000, new Customer { Name = diana }); // Putting Diana at the end :)
//1. System.Linq.Enumerable.DefaultOrFirst()
watch.Restart();
customers.FirstOrDefault(c => c.Name == diana);
watch.Stop();
Console.WriteLine("Diana was found in {0} ms with System.Linq.Enumerable.FirstOrDefault().", watch.ElapsedMilliseconds);
//2. System.Collections.Generic.List<T>.Find()
watch.Restart();
customers.Find(c => c.Name == diana);
watch.Stop();
Console.WriteLine("Diana was found in {0} ms with System.Collections.Generic.List<T>.Find().", watch.ElapsedMilliseconds);
}
Это из-за отсутствия служебных ресурсов Enumerator в List.Find() или этого плюс, возможно, что-то еще?
Find()
работает почти в два раза быстрее, надеясь, что команда .Net не будет отмечать его Устаревшее в будущем.