Linq与单个比较类(和界面)不同

时间:2010-12-30 18:15:09

标签: linq interface distinct iequalitycomparer iequatable

我的应用程序中有几个类,所有类都有一个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);

我收到了投射错误(SomeStuffISomeComparedStuff)。有没有办法做到这一点所以我只需要一个比较课程,否则我必须为我的每个课程创建一个(即使我总是要在Name上进行比较)?

注意:我理解这个问题&#34; title&#34;需要帮助。任何建议都会很棒。

2 个答案:

答案 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