2016-05-23 25 views
3

我有一個陣列兩個值

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

,目前我正在計算所有值之間的最大距離之間的距離84 = 89 - 5

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

現在我想計算的最小距離2 = 45 - 43

@ ycsun的評論 - 這不起作用

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

嘗試交換數組中的89和5,然後查看Max是否仍然有效。 –

+5

你得到零,因爲5 - 5 = 43 - 43 = ... = 0,對吧? – ycsun

+0

您的編輯不起作用,因爲包含索引的'SelectMany'的重載是第二個參數,而不是第一個參數,所以您希望'(a,ia)'和'(b,ib)'代替。 – juharr

回答

6

試試這個

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

這可以確保你不一樣的索引或一組數字,在計算數字之間的差異不同的索引兩次。基本上這使用包含索引的SelectMany的超負荷,那麼您只想使用Skip與當前索引之後的所有數字進行區別。

應該是使用的解決方案for迴路中的

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

的形式更高性能但需要注意。

這裏的一個警告是,如果你有負數。那麼a-bb-a的絕對值會有差異。在這種情況下,您需要首先對列表進行排序,以確保差異始終爲a爲更大的數字。

+0

可能更容易計算最大距離。通過先排序可以使其更快一些。 Values.OrderBy(x => x).Skip(1).Select((x,i)=>(x - Values [i-1]))。Min(); –

+1

@EyalShulman這不會起作用,因爲您在'Select' lambda中使用的'Values'沒有排序。相反,你需要'var sorted = Value.OrderBy(x => x).ToList();'then'sorted.Skip(1).Select((x,i)=> x - sorted [i-1] ).Min();' – juharr

2

就在兩個簡單循環:

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);