【问题标题】:Distinct list by specified fields and ignoring other but return them too [duplicate]按指定字段区分列表并忽略其他但也返回它们[重复]
【发布时间】:2017-11-23 15:21:15
【问题描述】:

我有一个包含字段的项目集合类。

class Item
{
    string s1;
    string s2;
    string s3;
    string d1;
    string d2;
}

MyCollection 看起来像这样:

    public class  MyCollection : ICollection<Item>, IEnumerable
{}

我需要通过“s1”、“s2”、“s3”来区分该列表,但作为回报,我需要获取包含所有这些字段(s1、s2、s3、d1、d2)的列表,而没有重复的项目。所以换句话说,作为回报,我需要一个MyCollection&lt;Item&gt;,而不是List&lt;anonymousType&gt;

现在我有类似的东西

var list = source.Select(k =&gt; new { k.s1, k.s2, k.s2 }).Distinct().ToList();

但它返回一个只有 s1,s2,s3 字段的列表。

有什么办法吗?

【问题讨论】:

  • 当您对给定的s1, s2, s3 有多个值时,您想要哪个d1d2?您可以从GroupBy 开始而不是独特的,然后您可以Select(x =&gt; new Item{s1=x.s1, ...},有几个选项,但您需要知道为d1, d2 选择什么

标签: c# linq


【解决方案1】:

您可以创建一个 IEqualityComparer 并使用它。

class ItemComparer : IEqualityComparer<Item>
{
    public bool Equals(Item x, Item y)
    {
        if (ReferenceEquals(x, y)) return true;
        if (ReferenceEquals(x, null)) return false;
        if (ReferenceEquals(y, null)) return false;
        if (x.GetType() != y.GetType()) return false;

        return x.s1 == y.s1 && x.s2 == y.s2 && x.s3 == y.s3;
    }

    public int GetHashCode(Item obj)
    {
        var hashCode = obj.s1.GetHashCode();
        hashCode = (hashCode * 397) ^ obj.s2.GetHashCode();
        hashCode = (hashCode * 397) ^ obj.s3.GetHashCode();
        return hashCode;
    }
}

那么你就可以这样做了

var distinctList = list.Distinct(new ItemComparer()).ToList();

【讨论】:

  • 你能解释一下你的GetHashCode方法实现吗?
  • 哈希码应该是唯一的。基本上将三个字符串的哈希值连接成应该非常独特的东西。
猜你喜欢
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2020-03-07
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多