我应该使用Sum方法和Count/Length找到最接近所有元素的中间值的数组元素吗?



如果我有arr=[1,3,4,-7,9,11],平均值为(1+3+4-7+9+11)/6 = 3.5,则元素3和4与3.5的距离相等,但其中较小的是3,因此结果为3。

你需要先找出平均值是多少。这涉及一个显式实现或隐式调用的循环。那么,我们假设你已经知道平均值是什么,因为你的问题是关于一些与平均值相关的值是如何得到的。让我们实现一个比较函数:

protected bool isBetter(double a, double b, double avg) {
double absA = Abs(a - avg);
double absB = Abs(b - avg);
if (absA < absB) return a;
else if (absA > absB) return b;
return (a < b) ? a : b;
}

现在你可以迭代你的数组,总是通过isBetter比较当前值和迄今为止的最佳值,如果它更好,那么它将是新的最佳值。最后得到的最好的数字就是结果。

假设您已经计算出平均值(下面的avg),那么您可以获得每个项目的diff,然后按diff排序,并获得第一个项目。这会给你数组

中最接近
var nearestDiff = arr.Select(x => new { Value=x, Diff = Math.Abs(avg-x)})
.OrderBy(x => x.Diff)
.First().Value;

实例:https://dotnetfiddle.net/iKvmhp

如果你必须得到低于平均值的物品

var lowerDiff = arr.Where(x => x<avg)
.OrderByDescending(x =>x)
.First();

您将需要using System.Linq以上任何一个工作

使用GroupBy是一个很好的方法

var arr = new int[] { 1, 4, 3, -7, 9, 11 };
var avg = arr.Average();
var result = arr.GroupBy(x=>Math.Abs(avg-x)).OrderBy(g=>g.Key).First().OrderBy(x=>x).First();

原始数组

(1、4、3、7、9、11)

分组后,键距平均值为abs,按

分组

[2.5, [1]]
[0.5, [4,3]]
[5.5, [9]]
[7.5, [11]]
[10.5, [7]]

按组键排序

0.5, [4 3]]
[2.5, [1]]
[5.5, [9]]
[7.5, [11]]
[10.5, [7]]

取第一组

[4 3]

排序组项

(3、4)

取第一项

3

将数组更改为[1,4,3,-7,9,11],颠倒了3和4的顺序,因为它们是根据最初的输出自然排序的,这是证明最后一步

所必需的。

最新更新