Найти () против Где ().Метода 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>.