Linq获得不同的财产

时间:2016-12-05 19:40:33

标签: c# linq

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

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

我想返回一份独特的" Code"仅限值。
所以我想要的结果是:

AAA   Test of AAA
BBB   Test of BBB
CCC   Test of CCC

我创建了一个比较器类:

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();
    }
}

在我的代码中我有:

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

然而,它仍然会将整个内容归还。

如何按属性获取不同的列表?

3 个答案:

答案 0 :(得分:5)

另一种选择是在Version不重要的情况下进行分组并在每组中取第一个值。

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

答案 1 :(得分:2)

您可以使用MoreLinq's DistinctBy

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

或者只是:

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

或者您可以更正注释中提到的GetHashCode方法

答案 2 :(得分:1)

重写GetHashCode()功能:

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

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