【问题标题】:Linq to get distinct property [duplicate]Linq获得不同的属性[重复]
【发布时间】:2017-04-20 07:19:31
【问题描述】:

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

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

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

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

但是它仍然返回全部内容。

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

【问题讨论】:

  • 不太可能是您的问题,但您的 GetHashCode 实现不正确。如果对象“相等”,HashCodes 应该匹配所以你想要obj.Code.GetHashCode()
  • 如何实现按属性获取不同列表?通过正确实现GetHashCode
  • 你可能想要来自 MoreLinq 的 DistinctBy 扩展

标签: c# linq


【解决方案1】:

如果Version 无关紧要,另一种选择是分组并取每个组中的第一个值。

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

【讨论】:

  • 这当然是正确答案
【解决方案2】:

你可以使用MoreLinq'sDistinctBy

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

或者只是:

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

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

【讨论】:

    【解决方案3】:

    重写你的GetHashCode()函数:

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

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

    【讨论】:

    • 就是这样。我没有意识到我没有检查房产。
    猜你喜欢
    • 2018-06-20
    • 2011-02-02
    • 2020-11-04
    • 1970-01-01
    • 2019-03-20
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多