2012-08-09 8 views

答えて

28

DistinctNameValueGuidEqualsメソッドを使用して重複を検索します。 Equalsを上書きしない場合は、参照をチェックします。

匿名型を使用して、Equalsを上書きしないように追加の手順を追加できます。匿名型は自動的にEqualsとGetHashCodeをオーバーライドし、各メンバを比較します。匿名型でdistinctを実行し、それをあなたのクラスに投影することで問題は解決します。

from firstEntry in FirstEntries 
select new 
{ 
    Name = firstEntry.Agent, 
    Value = firstEntry.AgentId 
}).Distinct().Select(x => new NameValueGuid 
{ 
    Name = x.Name, 
    Value = x.Value 
}); 
+0

回答いただきありがとうございました。 –

+1

「Distinctは重複を見つけるためにEqualsメソッドを使用します。 Equalsをオーバーライドしないと、参照をチェックします。 –

7

あなたはNameValueGuidGetHashCodeEqualsの両方の実装を供給していない可能性があります。

また、それが不可能な場合はDistinctのコールにIEqualityComparer<NameValueGuid>のインスタンスを渡すことができます。

参照:http://msdn.microsoft.com/en-us/library/system.linq.enumerable.distinct.aspx

+0

良い説明ですが、別の解決策があります:匿名型を使用しています(* Cadrell0 *の回答を参照してください) –

+0

+1、 'GetHashCode'を無効にする必要があります。それをオーバーライドした後、 'Distinct'はまず' GetHashCode'を呼び出して 'Equals'を呼び出す必要があるかどうかを判断します。 – DCShannon

4

あなたはDistinctNameValueプロパティを持つクラスのコンテキストで何を意味するかを定義する必要があります。 MSDNを参照してください。

比較対象を提供するDistinctのオーバーロードを試してください。例えば

:あなたはNameValueGuidのコード定義へのアクセス権を持っている場合

AgentsFilter = new BindableCollection<NameValueGuid>((from firstEntry in FirstEntries 
    select new NameValueGuid 
    { 
     Name = firstEntry.Agent, 
     Value = firstEntry.AgentId 
    }) 
    .Distinct((nvg) => nvg.Value) 
); 

あるいは、あなたがクラスに応じてGetHashCodeEqualsを上書きすることができます。繰り返しますが、MSDN

4
select new 
{ 
    Name = firstEntry.Agent, 
    Value = firstEntry.AgentId 
}) 
.Distinct() 
.Select(x => new NameValueGuid 
{ 
    Name = x.Name, 
    Value = x.Value 
}); 
関連する問題