Найти () против Где ().Метода 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 ответа:
где
Findметод onIEnumerable<T>? (Риторический вопрос.)The
WhereиFirstOrDefaultметоды применяются против нескольких видов последовательностей, в том числеList<T>,T[],Collection<T>и т. д. Любая последовательность, которая реализуетIEnumerable<T>можно использовать эти методы.Findдоступно только дляList<T>. Методы, которые обычно более применимы, тогда больше многоразовые и имеют большее влияние.я думаю, мой следующий вопрос в том, почему они вообще добавили находку. Это хороший совет. Единственное, о чем я могу думать, это то, что FirstOrDefault может возвращать другое значение по умолчанию, отличное от null. В противном случае это просто кажется бессмысленным дополнением
FindonList<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>.