2010-09-29 10 views
12

Salut J'ai reçu le linq suivant pour commander ma saisie après la valeur la plus basse. Mais je voudrais qu'il ne produise que les valeurs les plus basses.Sélectionnez uniquement les valeurs les plus faibles avec Linq

var sortedDict = (from entry in x where entry.Value > 0 orderby entry.Value ascending select entry); 

Maintenant s'il obtient l'entrée suivante.

3 4 2 6 2 

Ce serait ma sortie

2 2 3 4 6 

Que dois-je changer dans mon LINQ donc je ne reçois que cette sortie

2 2 

Répondre

28

Eh bien, vous pouvez faire:

int min = x.Min(entry => entry.Value); 
var lowestValues = x.Where(entry => entry.Value == min); 

Notez que j'ai explicitement ces diviser, comme si vous utilisez Where(entry => entry.Value == x.Min(y => y.Value)) il recherchera le minimum sur chaque itération. D'un autre côté, cela est vrai pour LINQ to Objects - mais dans LINQ to SQL, il serait probablement préférable de faire tout cela en une seule requête, et de laisser la base de données la trier.

+0

Est-ce que ce sera plus rapide que la réponse de KJN? Sa réponse provoquera-t-elle le recalcul de Min() pour chaque entrée dans la liste de données, ou le compilateur fera-t-il une mise en cache de cette valeur. J'en doute, mais j'aimerais le confirmer d'une façon ou d'une autre. –

+0

Oui, il sera généralement plus rapide. :) – kjn

+0

@ Øyvind Bråthen: Si vous utilisez LINQ to Objects, alors oui - Min() sera recalculé pour chaque entrée de la liste. –

8

Vous pouvez essayer quelque chose comme ceci:

data.Where (d => d == data.Min()) 

Notez que ce n'est pas nece C'est le moyen le plus rapide de le faire.

+0

Merci pour votre aide KJN – gulbaek

+0

Si vous cachez data.Min() dans une variable, vous pouvez prendre ceci de O (n^2) à O (n). Je fais une hypothèse sur l'implémentation de ces fonctions linq et du compilateur C#. – JSideris

5

Tout d'abord, trouver la valeur la plus basse:

var min = (from entry in x where entry.Value > 0 select entry).Min(); 

Ensuite, sélectionnez les éléments:

var sortedDict = from entry in x where entry.Value == min select entry 

Le tri n'est pas nécessaire pour votre scénario.

+2

Merci d'être le seul à avoir vérifié les chiffres au-dessus de 0 :-) – gulbaek

Questions connexes