Comment sélectionner un seul objet à l'aide Linq dans vb.net
Question
J'ai fait beaucoup de recherche à ce qui semble être un simple problème de LINQ, mais je ne peux pas comprendre comment faire saisir un objet d'une collection qui a un minimum spécifié (ou valeur maximale) sans avoir recours à un sorte comme ceci:
dim customers= GetCustomers()
dim youngest = (From c in customers
Order By c.age Ascending).ToList.First
Cette structure (code non testé) fonctionne très bien à l'exception que l'ensemble du réseau client doit être triée et placé dans une liste pour le seul but d'extraire la première valeur. Cela ne peut pas être la meilleure façon d'obtenir le minimum!
Notez que je veux l'ensemble du dossier c dans ce cas, pas l'âge de minumum d'un client qui peut être fait comme celui-ci (un exemple typique):
dim customers= GetCustomers()
dim youngest = (From c in customers
Select c.age).Min
Ou même
dim customers= GetCustomers()
dim youngest = (From c in customers
Select c).Min(Function(x) x.age)
Je ne peux pas pour la vie de me comprendre comment obtenir l'ensemble de l'objet (ou même l'indice) sans avoir recours à ce genre ...
La solution
Encore une fois, le code C #, je ne suis pas sûr que je l'ai eu droit à VB.NET
C #
Customer youngest = customers.Aggregate((c1, c2) => (c1.age < c2.age) ? c1 : c2);
VB.NET
dim youngest = customers.Aggregate( Function(ByVal c1, ByVal c2) IF( (c1.age < c2.age) , c1 , c2 ) );
Autres conseils
Il n'y a pas opérateur LINQ régulier qui évitera le tri de l'ensemble IEnumerable
. Mais vous n'êtes pas le premier qui a besoin d'une solution. Par exemple départ la réponse de Jason ici (si elle est MaxBy
et C #, mais vous aurez une idée): question simple LINQ en C #
Ou MinBy
de MoreLinq
Vous êtes presque. Vous devriez trouver que
dim youngest = (From c in customers
Order By c.age Ascending
Select c).First
fait ce que vous recherchez. (Je suis un gars C #, pas un gars de VB.NET, donc ma syntaxe peut être un peu.)