我的应用程序中有几个类,所有类都有一个Name
属性,我想用它作为我的比较基础(Distinct()
等)。由于我总是要在Name
上进行比较,所以我决定提取一个界面ISomeComparedStuff
,它只有Name
个所有其他类实现的属性。我建立了一个比较类:
public class MyComparer : IEqualityComparer<ISomeComparedStuff>
{
public bool Equals(ISomeComparedStuff x, ISomeComparedStuff y)
{
return x.Name == y.Name;
}
public int GetHashCode(ISomeComparedStuff obj)
{
return obj.Name.GetHashCode();
}
}
唯一的问题是当我尝试对其进行编码时:
public class SomeStuff : ISomeComparedStuff
{
...
}
public class SomeMoreStuff : ISomeComparedStuff
{
...
}
var someStuff = GetSomeStuff().Distinct(new MyComparer);
var someMoreStuff = GetSomeMoreStuff().Distinct(new MyComparer);
我收到了投射错误(SomeStuff
到ISomeComparedStuff
)。有没有办法做到这一点所以我只需要一个比较课程,否则我必须为我的每个课程创建一个(即使我总是要在Name
上进行比较)?
注意:我理解这个问题&#34; title&#34;需要帮助。任何建议都会很棒。
答案 0 :(得分:2)
不确定这是否是一个好的解决方案,但是如何使MyComparer成为通用类?
public class MyComparer<T> : IEqualityComparer<T>
where T: ISomeComparedStuff
{
public bool Equals(T x, T y)
{
return x.Name == y.Name;
}
public int GetHashCode(T obj)
{
return obj.Name.GetHashCode();
}
}
下行是你必须新建一个合适的版本:
var someStuff = GetSomeStuff().Distinct(new MyComparer<SomeStuff>());
var someMoreStuff = GetSomeMoreStuff().Distinct(new MyComparer<SomeMoreStuff>());
扩展一下,你也可以制作一个像这样的新扩展方法:
public static IEnumerable<T> DistinctByName<T>(this IEnumerable<T> values)
where T: ISomeComparedStuff
{
return values.Distinct(new MyComparer<T>());
}
答案 1 :(得分:0)
可能是这样的:
var someStuff = GetSomeStuff().Cast<ISomeComparedStuff>().Distinct(new MyComparer);
或使用非通用IEqualityComparer
。