Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两个值之间的距离_C#_Linq - Fatal编程技术网

C# 两个值之间的距离

C# 两个值之间的距离,c#,linq,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 = Valu

我有一个数组

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();
只有两个简单的循环:

int[]值=新的int[]{5,43,45,25,16,89,65,36,62};
int min=-1;
对于(int i=0;i
试试这个

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++)
for(int i=0;i
不过会更有效


但这里有一个警告,如果你有负数。然后,
a-b
的绝对值与
b-a
的绝对值之间会有差异。在这种情况下,您需要首先对列表进行排序,以确保差异总是以a作为较大的数字。

尝试交换数组中的89和5,看看Max是否仍然有效。结果为零,因为5-5=43-43=…=0,对吗?您的编辑不起作用,因为包含索引的
SelectMany
的重载是第二个参数,而不是第一个参数,因此您需要
(a,ia)
(b,ib)
。通过
int MaxDistance=Values.max()-Values.Min()计算最大距离可能更容易
可以通过先排序来加快速度。Values.OrderBy(x=>x).跳过(1).选择((x,i)=>(x-Values[i-1]).Min()@EyalShulman,这将不起作用,因为在
选择
lambda中使用的
值未排序。相反,您需要
var sorted=Value.OrderBy(x=>x.ToList()然后
排序。跳过(1)。选择((x,i)=>x-排序[i-1]).Min()
for(int i = 0; i < Values.Length - 1; i++)
    for(int j = i + 1; j < Values.Length; j++)