按指定字段区分列表并忽略其他字段但也返回它们

时间:2017-11-23 07:10:06

标签: c# linq

我有一个带有字段的收藏类项目。

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

MyCollection看起来像这样:

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

我需要通过&#39; s1&#39; s2&#39; s3&#39; s3&#39;来区分该列表。但作为回报获取所有这些字段(s1,s2,s3,d1,d2)的列表,没有重复的项目。换句话说,作为回报,我需要MyCollection<Item>,而不是List<anonymousType>

现在我有类似

的东西

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

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

有什么办法吗?

1 个答案:

答案 0 :(得分:3)

您可以创建IEqualityComparer&lt;&gt;并使用它。

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