単一の比較クラス(およびインターフェイス)と区別
-
14-10-2019 - |
質問
アプリケーションにはいくつかのクラスがあり、そのすべてが 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
)。これを行う方法はありますかので、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
.
所属していません StackOverflow