it-swarm.com.de

Wie erhalte ich mit LINQ die nächstgelegene Nummer aus einer Liste <int>?

So ermitteln Sie die nächstgelegene Nummer aus einem List<int> mit LINQ?

Beispielsweise:

List<int> numbers = new List<int>();
numbers.Add(2);
numbers.Add(5);
numbers.Add(7);
numbers.Add(10)

Ich muss den nächstgelegenen Wert in der Liste zu Nummer 9 finden. In diesem Fall 10.

Wie kann ich das mit LINQ machen?

56
ale

Wenn Sie LINQ to Objects verwenden und die Liste lang ist, würde ich Folgendes verwenden:

List<int> list = new List<int> { 2, 5, 7, 10 };
int number = 9;

int closest = list.Aggregate((x,y) => Math.Abs(x-number) < Math.Abs(y-number) ? x : y);

Diese Methode ist etwas komplexer als die von Anthony Pegram vorgeschlagene Lösung, hat jedoch den Vorteil, dass Sie die Liste nicht zuerst sortieren müssen. Dies bedeutet, dass Sie eine zeitliche Komplexität von O(n) anstelle von O(n*log(n)) und eine Speichernutzung von O(1) anstelle von O(n) haben.

120
Elian Ebbing

Wenn Sie diese Aufgabe mit LINQ ausführen möchten, können Sie dies wie folgt tun.

List<int> list = new List<int> { 2, 5, 7, 10 };
int number = 9;

// find closest to number
int closest = list.OrderBy(item => Math.Abs(number - item)).First();
34
Anthony Pegram

Die obigen Lösungen sind bestenfalls alle O(N).

Wenn Sie eine große Liste haben und diese Abfrage mit den nächstgelegenen Elementen mehrmals ausführen, ist es performanter, die Liste zuerst zu sortieren (O(NlogN)) und dann für jede Abfrage List<T>.BinarySearch Zu verwenden. Die Leistung für k Abfragen ist O( (k+N)logN ) im Vergleich zu O(kN) der vorherigen Methode.

4

Du könntest dir die binäre Suche suchen. Es ist die eingebaute Methode in c #, die Ihnen bei der Suche nach der nächstgelegenen Nummer hilft. Hier ein Beispiel: https://msdn.Microsoft.com/en-us/library/y15ef976 (v = vs.110) .aspx

0
A. Randhawa