我有一个带有字段的收藏类项目。
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字段的列表。
有什么办法吗?
答案 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();