Find() vs Où().FirstOrDefault()
je vois souvent des gens utiliser Where.FirstOrDefault()
pour faire une recherche et saisir le premier élément. Pourquoi ne pas utiliser Find()
? Est-il un avantage à l'autre? Je ne pouvais pas dire une différence.
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 réponses
Où est la méthode Find
sur IEnumerable<T>
? (Question rhétorique.)
les méthodes Where
et FirstOrDefault
sont applicables contre plusieurs types de séquences, y compris List<T>
, T[]
, Collection<T>
, etc. Toute séquence qui implémente IEnumerable<T>
peut utiliser ces méthodes. Find
n'est disponible que pour le List<T>
. Les méthodes qui sont généralement plus applicables, sont alors plus réutilisable et avoir un plus grand impact.
je suppose que ma prochaine question serait pourquoi ont-ils ajouter le trouver. C'est une bonne astuce. La seule chose à laquelle je pense est que FirstOrDefault pourrait retourner une valeur par défaut différente de null. Sinon, il semble tout simplement comme un ajout inutile
Find
on List<T>
est antérieur aux autres méthodes. List<T>
a été ajouté avec les génériques dans .NET 2.0, et Find
a été une partie de L'API pour cette classe. Where
et FirstOrDefault
ont été ajoutés en tant que méthodes d'extension pour IEnumerable<T>
avec Linq, qui est une version plus récente de .NET. Je ne peux pas dire avec certitude que si Linq existait avec la version 2.0, Find
n'aurait jamais été ajouté, mais c'est sans doute le cas pour de nombreuses autres fonctionnalités qui sont venues plus tôt.les versions de net qui ont été rendues obsolètes ou redondantes par des versions ultérieures.
je viens de le découvrir aujourd'hui, en faisant quelques tests sur une liste D'objets de 80K et constaté que Find()
peut être jusqu'à 1000% plus rapide que l'utilisation d'un Where
avec FirstOrDefault()
. Je ne le savais pas jusqu'à ce que je teste un minuteur avant et après tout. Parfois, c'était la même heure, sinon c'était plus rapide.
Find
est seulement mise en œuvre dans List<T>
, tandis que Where().FirstOrDefault()
fonctionne avec tous les IEnumerable<T>
.
il y a une différence très importante si la source des données est Entity Framework: Find
trouvera des entités dans l'état" ajouté "qui ne sont pas encore persistées, mais Where
ne le sera pas. C'est par la conception.