Найти () против Где ().Метода 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. В противном случае это просто кажется бессмысленным дополнением
Find
onList<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>
.