LINQ, um den nächstliegenden Wert zu erhalten?
Habe ich eine Liste, MyStuff hat eine Eigenschaft vom Typ Float.
Gibt es Objekte mit Eigenschaftswerten von 10,20,22,30.
Schreiben brauche ich eine Abfrage, die Objekte erkennt, die am nächsten an 21, Sie würde in diesem Fall finden die 20-und 22-Objekt. Dann muss ich schreiben, eine, die findet das Objekt schließt an 21, ohne über, und würde es wieder das Objekt mit einem Wert von 20.
Habe ich keine Ahnung wo/wie anfangen mit diesem. Hilfe?
Dank.
Update - wow gibt es so viele geniale Antworten hier. Danke! Ich weiß nicht, was man zu Folgen, so werde ich versuchen Sie alle. Eine Sache, die macht es vielleicht mehr (oder weniger) interessant ist, dass die gleiche Abfrage für LINQ-to-SQL-Entitäten, so dass möglicherweise die Antwort geerntet aus dem MS Linq-Foren funktionieren am besten? Weiß nicht.
InformationsquelleAutor der Frage Snowy | 2010-09-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Lösung, die erfüllt, dass die zweite Abfrage in linearer Zeit:
(Editiert von 'oben' nach 'unten' nach Klärung)
Als für die erste query, es wäre das einfachste zu verwenden
MoreLinq
'sMinBy
Erweiterung:Es ist auch möglich, um es in der standard-LINQ-in der linearen Zeit, aber mit 2 geht von der Quelle:
Wenn Effizienz ist nicht ein Problem, so Sortieren Sie die Reihenfolge und setze den ersten Wert in
O(n * log n)
wie andere schon gepostet haben.InformationsquelleAutor der Antwort Ani
Versuchen, diese zu Sortieren, indem der absolute Wert der Differenz zwischen der Anzahl und 21 und dann nehmen Sie das erste Element:
Oder verkürzen Sie es nach @Yuriy Faktorovich ' s Kommentar:
InformationsquelleAutor der Antwort amurra
Basierend auf dieser Beitrag auf der Microsoft Linq-Foren:
InformationsquelleAutor der Antwort nrkn
ODER
und hier kommt eine Erweiterung-Methode:
Verwendung:
InformationsquelleAutor der Antwort Danny Chen