15

次の linq 式があります。

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

しかし、何らかの理由で、AgentsFilter コレクションは重複でいっぱいです。私の何が問題なのDistinct()ですか?

4

4 に答える 4

37

DistinctEqualsメソッド onを使用しNameValueGuidて重複を見つけます。をオーバーライドしない場合Equalsは、参照がチェックされます。

匿名型を使用して、Equals のオーバーライドを回避するためのステップを追加できます。匿名型は、Equals と GetHashCode を自動的にオーバーライドして、各メンバーを比較します。匿名型で個別の処理を行い、それをクラスに投影すると問題が解決します。

from firstEntry in FirstEntries
select new
{ 
    Name = firstEntry.Agent,
    Value = firstEntry.AgentId
}).Distinct().Select(x => new NameValueGuid
{
    Name = x.Name,
    Value = x.Value
});
于 2012-08-09T13:17:01.337 に答える
10

GetHashCodeEqualsonの両方の実装を提供していない可能性がありますNameValueGuid

または、それが不可能な場合はIEqualityComparer<NameValueGuid>、 の呼び出しに のインスタンスを渡すことができますDistinct

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

于 2012-08-09T13:17:36.473 に答える
4
select new
{ 
    Name = firstEntry.Agent,
    Value = firstEntry.AgentId
})
.Distinct()
.Select(x => new NameValueGuid
{
    Name = x.Name,
    Value = x.Value
});
于 2012-08-09T13:21:18.110 に答える
4

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

比較子を提供できる Distinct のオーバーロードを試してください。

例えば:

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

または、NameValueGuid のコード定義にアクセスできる場合は、必要に応じてクラスをオーバーライドできGetHashCodeますEquals。繰り返しますが、MSDNを参照してください

于 2012-08-09T13:18:06.520 に答える