Find() vs Où().FirstOrDefault()
Je vois souvent des gens en utilisant Where.FirstOrDefault()
de faire une recherche et de saisir le premier élément. Pourquoi ne pas simplement 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();
}
}
}
- FWIW,
list.FirstOrDefault(x => x == "item3");
est plus concis que l'aide de deux.Where
et.FirstOrDefault
. - Je suppose que ma prochaine question serait pourquoi ont-ils ajouter le trouver à tous. C'est une bonne astuce. La seule chose que je peux penser, c'est que le FirstOrDefault pourrait retourner une valeur par défaut différente de la valeur autre que null. Sinon, il semble juste comme une inutile de plus.
Find
est antérieure à LINQ. (il était disponible .NET 2.0 et vous ne pouvez pas utiliser les lambdas. Vous avez été obligé d'utiliser des méthodes ou des méthodes anonymes)
Vous devez vous connecter pour publier un commentaire.
Où est le
Find
méthode surIEnumerable<T>
? (Question rhétorique.)La
Where
etFirstOrDefault
méthodes sont applicables à l'encontre de plusieurs types de séquences, y comprisList<T>
,T[]
,Collection<T>
, etc. Une séquence qui met en œuvreIEnumerable<T>
pouvez utiliser ces méthodes.Find
est disponible uniquement pour lesList<T>
. Les méthodes qui sont généralement plus applicable, sont alors plus réutilisables et avoir un plus grand impact.Find
surList<T>
est antérieure à l'autre des méthodes.List<T>
a été ajoutée avec les génériques .NET 2.0, etFind
a fait partie de l'API pour la classe.Where
etFirstOrDefault
ont été ajoutés comme des méthodes d'extension pourIEnumerable<T>
avec Linq, ce qui est un plus tard .Version NET. Je ne peux pas dire avec certitude que si Linq existé avec la version 2.0 quiFind
n'aurait jamais été ajoutées, mais qui est sans doute le cas pour de nombreuses autres fonctionnalités qui est venu plus tôt .NET les versions qui ont été rendues obsolètes ou redondantes par les versions ultérieures.Where(condition).FirstOrDefault()
optimise au moins aussi bien et parfois mieux queFirstOrDefault(condition)
seul. Nous utilisons toujoursWhere()
pour obtenir les meilleures performances lorsqu'ils sont disponibles.Je viens de découvrir aujourd'hui, de faire quelques tests sur une liste de 80K des objets et a constaté que
Find()
peut être jusqu'à 1000% plus rapide que d'utiliser unWhere
avecFirstOrDefault()
. Je ne le savais pas jusqu'à ce que le test d'un timer avant et après chaque tous les. Parfois c'est le même temps, sinon, il était plus rapide..ToList()
ou.ToArray()
pour effectuer la requête.Find
rend l'utilisation de clés primaires (d'où les indices), alors queWhere
est une simple requête sqlFindBy
dans ces cas-là...Find
est seulement mise en œuvre dansList<T>
, tandis queWhere().FirstOrDefault()
fonctionne avec tous lesIEnumerable<T>
.Il y a une différence très importante si la source des données est l'Entity Framework:
Find
trouverez des entités dans le "ajoutée" de l'état qui ne sont pas encore persisté, maisWhere
ne sera pas. C'est par la conception.en plus Anthony répondre
Where()
visite à travers tous les enregistrements, puis retourner le résultat(s) tout enFind()
n'avez pas besoin de parcourir à travers tous les enregistrements si prédicat match avec le prédicat.donc, disons que vous disposez de la Liste de la classe de Test ayant
id
etname
propriétés.Donnera sortie de
2
, et seulement 2 visites Trouver nécessaire de donner suite , mais si vous utilisezWhere().FirstOrDefault()
nous allons visiter tous les enregistrements, puis nous obtenons des résultats.Donc , quand vous savez que vous ne voulez premier résultat à partir d'enregistrements dans la collection
Find()
sera plus adapté puisWhere().FirtorDefault();
FirstOrDefault
sera " bulle de mise en place de la chaîne et arrêter l'énumération de tout. J'utilise le terme de "bubble up" à défaut d'une meilleure expression, parce qu'en fait, chaque sélecteur/prédicat sera transmise à l'autre, de sorte que la dernière méthode de la chaîne est en train de travailler d'abord.