質問

アプリケーションにはいくつかのクラスがあり、そのすべてが 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)。これを行う方法はありますかので、1つの比較クラスだけが必要です。そうでなければ、クラスのすべてに1つを作成する必要があります(常に比較するつもりですが Name)?

注:この質問「タイトル」にはヘルプが必要です。どんな提案でも素晴らしいでしょう。

役に立ちましたか?

解決

これが良い解決策であるかどうかはわかりませんが、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>());
}

他のヒント

多分何かのようなもの:

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

または、非遺伝子を使用します IEqualityComparer.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top