两个值之间的距离

时间:2016-05-23 12:44:06

标签: c# linq

我有一个数组

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

2 个答案:

答案 0 :(得分: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为较大的数字。

答案 1 :(得分: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);