Найти () против Где ().Метода firstordefault()


Я часто вижу, как люди используют Where.FirstOrDefault() выполнить поиск и захватить первый элемент. Почему бы просто не использовать Find()? Есть ли преимущество у другого? Я не мог сказать разницу.

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();
        }
    }
}
4 111

4 ответа:

где Find метод on IEnumerable<T>? (Риторический вопрос.)

The Where и FirstOrDefault методы применяются против нескольких видов последовательностей, в том числе List<T>,T[],Collection<T> и т. д. Любая последовательность, которая реализует IEnumerable<T> можно использовать эти методы. Find доступно только для List<T>. Методы, которые обычно более применимы, тогда больше многоразовые и имеют большее влияние.

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

Find on List<T> предшествует другим методам. List<T> был добавлен с дженериками в .NET 2.0, и Find был частью API для этого класса. Where и FirstOrDefault были добавлены в качестве методов расширения для IEnumerable<T> С Linq, который является позже .Net версии. Я не могу с уверенностью сказать, что если Linq существовал с выпуском 2.0, что Find никогда бы не был добавлен, но это, возможно, относится ко многим другим функциям, которые появились в более ранних версиях .NET, которые были сделаны устаревшими или избыточными более поздними версиями.

Я только что узнал сегодня, делая некоторые тесты на список 80k объектов и обнаружил, что Find() может быть до 1000% быстрее, чем при использовании Where С FirstOrDefault(). Я не знал этого до тестирования таймера до и после каждого из них. Иногда это было одно и то же время, иначе это было быстрее.

Find только реализовала на List<T>, в то время как Where().FirstOrDefault() работает с IEnumerable<T>.

существует очень важное различие, если источником данных является Entity Framework:Find найдет объекты в состоянии "добавлено", которые еще не сохраняются, но Where не будет. Это сделано специально.