列表<double>的GroupBy具有容差不起作用

kdm*_*kdm 5 c# linq

Groupby对C#有疑问.

我做了List如下所示:

List<double> testList = new List<double>();

testList.Add(1);    
testList.Add(2.1);  
testList.Add(2.0);  
testList.Add(3.0);  
testList.Add(3.1);  
testList.Add(3.2);  
testList.Add(4.2);  
Run Code Online (Sandbox Code Playgroud)

我想将这些数字列表分组如下:

group 1 => 1  
group 2 => 2.1 , 2.0  
group 3 => 3.0 , 3.1 , 3.2  
group 4 => 4.2
Run Code Online (Sandbox Code Playgroud)

所以,我写了这样的代码:

var testListGroup = testList.GroupBy(ele => ele, new DoubleEqualityComparer(0.5));
Run Code Online (Sandbox Code Playgroud)

DoubleEqualityComparer 定义是这样的:

public class DoubleEqualityComparer : IEqualityComparer<double>
{
    private double tol = 0;

    public DoubleEqualityComparer(double Tol)
    {
        tol = Tol;
    }

    public bool Equals(double d1,double d2)
    {
        return EQ(d1,d2, tol);
    }

    public int GetHashCode(double d)
    {
        return d.GetHashCode();
    }
    public bool EQ(double dbl, double compareDbl, double tolerance)
    {
        return Math.Abs(dbl - compareDbl) < tolerance;
    }
}
Run Code Online (Sandbox Code Playgroud)

然而该GroupBy条款并不像这样:

group 1 => 1  
group 2 => 2.1
group 3 => 2.0  
group 4 => 3.0
group 5 => 3.1
group 6 => 3.2
group 7 => 4.2
Run Code Online (Sandbox Code Playgroud)

我不知道问题是什么.如果有问题和解决方案,请告诉我.

Sil*_*der 1

您可以使用下面的代码示例进行分组,

var list = testList.GroupBy(s => Convert.ToInt32(s) ).Select(group => new { Key = group.Key, Elements = group.ToList() });

//OutPut
//group 1 => 1  
//group 2 => 2.1 , 2  
//group 3 => 3 , 3.1 , 3.2  
//group 4 => 4.2
Run Code Online (Sandbox Code Playgroud)

代码说明,当我们申请GroupBy一个只有单个数据列的列表时,它通过查找相同的内容进行分组。例如,假设您有字符串列表(foo1,foo2,foo3,foo1,foo1,foo2)。因此它分为三个独立的组,分别为 foo1、foo2 和 foo3。

但在这种情况下,你找不到任何相同的内容(1.0,2.1,2.2,2.3,3.1,3.2...),所以我们应该做的是将它们作为相同的内容。当我们将它们转换为intthen 时,它给出 (1,2,2,2,3,3...)。然后我们就可以轻松地对其进行分组。

  • 如果 OP 希望在另一组数字上运行它,它将给出误报结果: (1.0, 1.5, 2.5) =&gt; ([1.0], [1.5,2.5]) 因为 `Convert.ToInt32` 返回最接近的偶数number 如果值位于两个整数之间的中间。1.5 =&gt; 2.0,2.5 =&gt; 2.0。 (3认同)