2

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

我收到一个演员错误(SomeStuffto ISomeComparedStuff)。有没有办法做到这一点,所以我只需要一个比较类,否则我必须为我的每个类创建一个(即使我总是要比较Name)?

注意:我理解这个问题“标题”需要帮助。任何建议都会很棒。

4

2 回答 2

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>());
}
于 2010-12-30T20:13:46.697 回答
0

也许是这样的:

var someStuff = GetSomeStuff().Cast<ISomeComparedStuff>().Distinct(new MyComparer);

或者使用非通用的IEqualityComparer.

于 2010-12-30T20:05:38.927 回答