LINQ pour Obtenir la Valeur la plus Proche?
J'ai une Liste, Leur a une propriété de Type Float.
Il y a des objets avec des valeurs de propriété de 10,20,22,30.
J'ai besoin d'écrire une requête qui trouve les objets les plus proches à 21, dans ce cas, il trouverait le 20 et 22 de l'objet. Ensuite, j'ai besoin d'en écrire un qui trouve l'objet ferme de 21 sans le dépasser, et il serait de retour de l'objet avec une valeur de 20.
Je n'ai aucune idée de l'endroit où/comment commencer avec celui-ci. De l'aide?
Grâce.
La mise a jour de wow il y en a tellement génial réponses ici. Merci! Je ne sais pas lequel suivre donc je vais toutes les essayer. Une chose qui pourrait le rendre plus (ou moins) intéressant, c'est que la même requête devra s'appliquer à LINQ-to-SQL entités, peut-être que la réponse récoltées à partir de la MS Linq forums de travail sera le meilleur? Ne sais pas.
- Er, 22 est plus de 21 ans.... ne vaudrait-il trouver 20?
- Oui je voulais dire 20, désolé pour le screwup.
Vous devez vous connecter pour publier un commentaire.
Voici une solution qui satisfait à la deuxième requête en temps linéaire:
(Édité à partir "d'en haut" à "en dessous" après clarification)
Comme pour la première requête, il serait plus simple d'utiliser
MoreLinq
'sMinBy
extension:Il est également possible de le faire dans la norme LINQ dans le temps linéaire, mais avec 2 passes de la source:
Si l'efficacité n'est pas un problème, vous pouvez trier l'ordre et de sélectionner la première valeur dans
O(n * log n)
comme d'autres l'ont publié.Essayer de les trier par la valeur absolue de la différence entre le nombre et le 21, puis prendre le premier élément:
Ou raccourcir selon @Yuriy Faktorovich commentaire:
Select
et de mettre de la distance dans leOrderBy
MyStuff
est trié, ce qui pourrait être fait en O(n), quiOrderBy
ne l'est pas. Quelque chose à considérer si votre liste est déjà triée et non négligeable dans la taille (ou ce qui pourrait s'exécuter dans une boucle).Basé sur ce post à Microsoft Linq forums:
OU
et voici une méthode d'extension:
Utilisation:
OrderBy
après leWhere
, afin de ne pas avoir de sorte que de nombreux éléments.