关于c#:Linq获得不同的属性

Linq to get distinct property

本问题已经有最佳答案,请猛点这里访问。

我有一个这样的数据表(不是我的表不能更改数据)

1
2
3
4
5
6
Code     Version    Description
AAA      0.0.0.0    Test of AAA
AAA      0.0.0.1    Test of AAA
BBB      0.0.0.0    Test of BBB
CCC      0.0.0.0    Test of CCC
CCC      0.0.0.1    Test of CCC

我只想返回唯一"代码"值的列表。所以我想要的结果是:

1
2
3
AAA   Test of AAA
BBB   Test of BBB
CCC   Test of CCC

我创建了一个比较器类:

1
2
3
4
5
6
7
8
9
10
11
12
public class MyComparer : IEqualityComparer<MY_DATA_TABLE>
{
    public bool Equals(MY_DATA_TABLE x, MY_DATA_TABLE y)
    {
        return x.CODE == y.CODE;
    }

    public int GetHashCode(MY_DATA_TABLE obj)
    {
        return obj.GetHashCode();
    }
}

在我的代码中,我有:

1
2
3
var mapCodes = (from mtc in GetAllData() select mtc)
                    .Distinct(new MyComparer ())
                    .ToList();

但是,它仍然返回整个内容。

我如何才能按属性获得一个不同的列表?


另一种选择是,如果Version不重要,则执行分组依据并在每个组中取第一个值。

1
2
3
var mapCodes = (from mtc in GetAllData()
                group mtc by mtc.Code into grp
                select grp.First()).ToList();


你可以用morelinq的distinctby

1
2
 var mapCodes = (from mtc in GetAllData()
                 select mtc).DistinctBy(x=>x.Code).ToList();

或者只是:

1
var mapCodes = GetAllData().DistinctBy(x=>x.Code).ToList();

或者您可以按照注释中的说明更正gethashcode方法。


重写您的GetHashCode()函数:

1
2
3
4
public int GetHashCode(MY_DATA_TABLE obj)
{
    return obj.CODE.GetHashCode();
}

规则是,equals和GetHashCode()都应该检查相同的属性,只检查Equals()中的代码和GetHashCode()中的whiole对象。