2012-11-11 5 views
11

私はLinqに関する本を読んでいて、Distinctメソッドには比較関数を使うオーバーロードがあることがわかりました。これはコレクションから別個のエンティティを取得したいが、他のプロパティが異なる場合であっても、エンティティIDに比較されるようにしたいという問題に対して、良い解決策となります。Linq Distinctメソッドでどのようにカスタムコンペアラを使用しますか?

私はGribulatorエンティティを持っている場合、本によると、私はこのような比較演算子を作成することができるはず...

private class GribulatorComparer : IComparer<Gribulator> { 
    public int Compare(Gribulator g1, Gribulator g2) { 
    return g1.ID.CompareTo(g2.ID); 
    } 
} 

...そして、このようにそれを使用して...

List<Gribulator> distinctGribulators 
    = myGribulators.Distinct(new GribulatorComparer()).ToList(); 

はしかし、これは

「System.Collections.Generic.Listは」「「明確な」と最高の拡張メソッドのオーバーロードの定義が含まれていません...次のコンパイラエラーが発生しますSystem.Linq.Enumerable .Distinct(System.Collections.Generic.IEnumerable、System.Collections.Generic.IEqualityComparer) 'は、いくつかの無効な引数を持ってい

引数2:から変換できません 'System.Collections.Generic.IEqualityComparer' から' LinqPlayground.Program.GribulatorComparer 「

は、私は少し周りを探索してきたが、このようなコードを使用する例が、コンパイラエラーに関する苦情をたくさん見てきました。

私は間違っていますか?また、これを行う最善の方法ですか?私はここで一回限りの解決策を望んでいるので、エンティティ自体のコードを変更したいとは思わないでください。私はエンティティを通常のままにしたいが、この1つの場所ではIDだけで比較する。

ありがとうございました。あなたはIComparer<T>としてあなた比較子を実装しようとしている

+0

私はVS2012を使用していますので、C#で.NET 4.0を使用しています。 –

答えて

13

、LINQのメソッドオーバーロードは、IEqualityComparerの実装を必要とします

private class GribulatorComparer : IEqualityComparer<Gribulator> { 
    public bool Equals(Gribulator g1, Gribulator g2) { 
    return g1.ID == g2.ID; 
    } 
} 

編集:

明確にするため、IComparerインターフェイスはとして、ソートに使用することができますこれは基本的にはCompare()メソッドの機能です。このよう

:その比較子を使用してあなたのコレクションを並べ替えます

items.OrderBy(x => new ItemComparer()); 

private class ItemComparer : IComparer<Item> 
{ 
    public int Compare(Item x, Item y) 
    { 
     return x.Id.CompareTo(y.Id) 
    } 
} 

は、しかし、LINQは(int型同上のような)簡単なフィールドのためにそれを行うための方法を提供します。

items.OrderBy(x => x.Id); 
+0

感謝のピーター、それはそれを説明します!私は本の中で使用した例では、[並べ替えのためだったが、彼は彼が個別に議論そこから参照していた、と私は別のインターフェースを必要とするという事実に拾っていませんでした。ところで、実際に書籍:( –

+0

には非常に明確ではなかった、代わりに比較演算のための別のクラスを作成するので、無名関数でこれを行う方法がある場合は、あなたが知っているのですか?限りやり過ぎのように思える –

+0

私が知っているように、そこではありません。私は実際にそのようなものでLINQ演算子をオーバーロードについて考えてきた。 –

関連する問題