2

アプリケーションにいくつかのクラスがあり、そのすべてに、Name比較の基礎として使用したいプロパティ (Distinct()など) があります。私は常に を比較するつもりなので、他のすべてのクラスが実装するプロパティを単に持っているNameインターフェース を抽出することにしました。比較クラスを次のように設定しました。ISomeComparedStuffName

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) が発生します。これを行う方法はあるので、必要な比較クラスは 1 つだけ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 に答える