2010-12-30 10 views
2

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

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); 

私はキャストエラー(ISomeComparedStuffからSomeStuff)を取得しています。これを行うにはいくつかの方法がありますが、1つのクラスを比較する必要があります。それ以外の場合は、クラスを1つずつ作成する必要があります(ただし、常にNameを比較します)。

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

答えて

2

これは良い解決策であるかどうかわかりませんが、MyComparerを汎用クラスにする方法についてはどうですか?

public static IEnumerable<T> DistinctByName<T>(this IEnumerable<T> values) 
    where T: ISomeComparedStuff 
{ 
    return values.Distinct(new MyComparer<T>()); 
} 
0

たぶんのようなもの:

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

または非ジェネリックIEqualityComparerを使用しています。

+0

私はこのアプローチを好む:

var someStuff = GetSomeStuff().Distinct(new MyComparer<SomeStuff>()); var someMoreStuff = GetSomeMoreStuff().Distinct(new MyComparer<SomeMoreStuff>()); 

ビットを展開するには、あなたもこのような新しい拡張メソッドを作ることができる:

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(); } } 

欠点は、あなたがアップし、新たなに適切なバージョンを持っています(特にDistinctByName()などの別の拡張メソッドでカプセル化されている場合)、元の型に戻す必要があります。そうでなければ、結果のIEnumerable はおそらくかなり役に立たないでしょう。 –

+0

はい。私は、キャスト後にすべてのデータを失うことに懸念します。 –

+0

データを失うことはありません。インターフェースへのキャストはロッシーではありません。 –

関連する問題