使用LINQ的一组浮点数的差异

时间:2013-10-03 10:39:54

标签: c# linq floating-point dataview

我在数据视图中有一个双列类型的列。 我必须检查所有列中的值是否彼此不同。

有没有办法通过linq来实现?

4 个答案:

答案 0 :(得分:2)

如果你想比较浮点类型我真的建议你定义你自己的IEqualityComparer<T>覆盖Equals()方法,以指定相等的度量,因为浮点数不是这很容易比较。

如果你的比较值来自某些计算,那么正确比较它们只是另一个理由,或者你可能会发现你看到的数字2与另一个数字2不匹配只是因为它是2.000000001左右。

因此,请使用以下LINQ查询

double[] items = new[] { 1d, 2d, 3d };
var dups = items.GroupBy(i => i, new MyDoubleComparer())
                .Where(g => g.Count() > 1)
                .Select(g => g.Key);

使用您自己的比较器。您可以指定它应该有多精确。

class MyDoubleComparer : IEqualityComparer<double>
{
    public bool Equals(double x, double y)
    {
        // your comparing logic here
    }

    public int GetHashCode(double obj)
    {
        throw new NotImplementedException();
    }
}

有关如何比较浮点数的灵感,请导航herehere

答案 1 :(得分:1)

listOfItems.Distinct().Count() == listOfItems.Count

假设listOfItems是List<double>

答案 2 :(得分:0)

您可以尝试查找重复项:

int[] listOfItems = new[] { 4, 2, 3, 1, 6, 4, 3 };
var duplicates = listOfItems
    .GroupBy(i => i)
    .Where(g => g.Count() > 1)
    .Select(g => g.Key);

如果重复项包含值,则列中的所有值都不会相互不同。

答案 3 :(得分:0)

var distinctValues = view.ToTable(true, "YourColumn");
if(distinctValues.Rows.Count == view.Count)
  //Column values are same