2016-05-23 18 views
3

Ich habe ein ArrayEntfernung zwischen zwei Werten

int[] Values = new int[] { 5, 43, 45, 25, 16, 89, 65, 36, 62 }; 

und zur Zeit i zwischen allen Werten 84 = 89 - 5

int MaxDistance = Values.SelectMany((a) => Values.Select((b) => Math.Abs(a - b))).Max(); 

jetzt die maximale Entfernung am Berechnung Ich möchte den Mindestabstand 2 = 45 - 43

berechnen @ ycsun's commment - das funktioniert nicht

int MinDistancee = Values.SelectMany((ia, a) => Values.Select((ib, b) => ib == ia ? int.MaxValue : Math.Abs(a - b))).Min(); 
+0

Versuchen Sie, 89 und 5 in Ihrem Array zu tauschen, und sehen Sie, ob Max immer noch funktioniert. –

+5

Sie erhalten Null, weil 5 - 5 = 43 - 43 = ... = 0, oder? – ycsun

+0

Ihre Bearbeitung funktioniert nicht, weil die Überladung für 'SelectMany', die den Index enthält, das zweite Argument ist, und nicht das erste, also würden Sie stattdessen' (a, ia) 'und' (b, ib) 'wollen. – juharr

Antwort

6

dieses Versuchen Sie stattdessen

int MinDistance = Values.SelectMany(
    (a, i) => Values.Skip(i + 1).Select((b) => Math.Abs(a - b))).Min(); 

Dies stellt sicher, dass Sie nicht den Unterschied zwischen den Zahlen auf dem gleichen Index oder eine Reihe von Zahlen berechnen, bei verschiedene Indizes zweimal. Im Grunde verwendet dies die Überladung von , die den Index enthält, dann möchten Sie nur Ihren Unterschied mit allen Zahlen nach dem aktuellen Index machen, indem Sie Skip verwenden.

Es sollte beachtet werden, dass eine Lösung, obwohl for Schleifen in Form von

for(int i = 0; i < Values.Length - 1; i++) 
    for(int j = i + 1; j < Values.Length; j++) 

wäre performant verwenden.

Ein Vorbehalt hier ist jedoch, wenn Sie negative Zahlen haben. Dann gibt es einen Unterschied zwischen dem absoluten Wert von a-b gegenüber b-a. In diesem Fall sollten Sie die Liste zuerst sortieren, um sicherzustellen, dass der Unterschied immer a als die größere Nummer hat.

+0

Könnte es ein bisschen schneller machen, indem Sie zuerst sortieren. Values.OrderBy (x => x) .Skip (1) .Wählen Sie ((x, i) => (x - Werte [i-1])). Min(); –

+1

@EyalShulman Das wird nicht funktionieren, weil die Werte, die Sie in Ihrem 'Select'-Lambda verwenden, nicht sortiert sind. Stattdessen benötigen Sie 'var sorted = Value.OrderBy (x => x) .ToList();' dann 'sorted.Skip (1) .Wählen Sie ((x, i) => x - sortierte [i-1]) .Min(); ' – juharr

2

Nur zwei einfache Schleifen:

int[] Values = new int[] { 5, 43, 45, 25, 16, 89, 65, 36, 62 }; 

    int min = -1; 

    for (int i = 0; i < Values.Length - 1; ++i) 
    for (int j = i + 1; j < Values.Length; ++j) { // please, notice j = i + 1 
     int v = Math.Abs(Values[i] - Values[j]); 

     if ((min < 0) || (v < min)) 
     min = v; 
    } 

    // 2 == 45 - 43 
    Console.Write(min); 
Verwandte Themen