gpt4 book ai didi

linq - 使用 LINQ 或循环对相对接近的值进行分组

转载 作者:行者123 更新时间:2023-12-01 05:16:11 25 4
gpt4 key购买 nike

我想这会比 C# 更数学。我有一个浮点值数组,其中大多数值属于少数几个紧密排列的范围之一。下面是一个例子(下限=0,上限=612):

3.4,5.0,6.1, 
144.0,144.14,145.0,147.0,
273.77,275.19,279.0,
399.4,399.91,401.45,
533.26,537.0,538.9

这是一个包含 16 个值的数组,只是将它们分开以显示那些“组”。我需要做的是以某种方式对它们进行分组,无论是使用 Linq,还是手动循环或其他任何方式,以便这些接近的值属于一个组。

像除以 10(或 100)这样的简单数学运算是行不通的,因为 399 与 401 属于不同的组(上例中的第 4 组)。另一种方法是创建某种直方图,但我在这里寻找一些简单的东西。任何帮助将不胜感激。

最佳答案

使用 GroupBy 进行聚类的另一个想法使用自定义比较器

var numbers = new float[]
{
3.4f, 5.0f, 6.1f, 144.0f, 144.14f, 145.0f,
147.0f, 273.77f, 275.19f, 279.0f, 399.4f, 399.91f, 401.45f,
49, 50, 51,
533.26f, 537.0f, 538.9f
};

foreach (var group in numbers.GroupBy(i => i, new ClosenessComparer(4f)))
Console.WriteLine(string.Join(", ", group));

和定制 ClosenessComparer :
public class ClosenessComparer : IEqualityComparer<float>
{
private readonly float delta;

public ClosenessComparer(float delta)
{
this.delta = delta;
}

public bool Equals(float x, float y)
{
return Math.Abs((x + y)/ 2f - y) < delta;
}

public int GetHashCode(float obj)
{
return 0;
}
}

和输出:
1: 3,4 5 6,1
2: 144 144,14 145 147
3: 273,77 275,19 279
4: 399,4 399,91 401,45
6: 49 50 51
5: 533,26 537 538,9

关于linq - 使用 LINQ 或循环对相对接近的值进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12364000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com