2011-01-28 6 views
1

は、次のことを表現するための操作を設定します。LINQ Set操作は(場合を除き、INTERSECT)を動作していない

 foreach (Group group in groups) 
     { 
      if (user.Groups.Contains(group)) 
      { 
       assignedGroups.Add(group); 
      } 
      else 
      { 
       availableGroups.Add(group); 
      } 
     } 

私はそれがこれを達成する2ライナーであるべきと思いました:集合演算が空に割り当てられたリストと満たされた利用可能なリストになりながら

var assigned = user.Groups.Intersect(groups); 
var available = groups.Except(user.Groups); 

私はforeachのアプローチこの例を実行するたびに、正しく私のリストを埋めます。 私は平等チェックに関して問題でなければならないと考えましたが、Contains()がうまく動作しているということは間違っています。 誰でも私の誤解をここで見られるのを助けることができますか?

IEnumerableをグループも情報がいくつかの助けであることを念のために、LINQクエリの結果です...

+0

あなた自身のメソッドが「包含」されているか、提供されていますか? – leppie

+0

が提供されていますが、ここでは個人的なフレーバーはありません –

+0

交差点には違いがありません。除外事項については試していません。 –

答えて

2

まあ、それはは違いを作るが、の点からべきではありません対称性のビュー私はあなたがどのようにしてassignedを作成しているかを逆にします。私はまた、クエリは一度だけ実行されていることを確認したい、と残りの操作は、インプロセスで発生していること:

var cachedGroups = groups.ToList(); 
var assigned = cachedGroups.Intersect(user.Groups); 
var available = cachedGroups.Except(user.Groups); 

一つの可能​​性はuser.Groupsは、カスタム等値比較子を持っていることです。そのになりますが、なぜforeachのバージョンは動作しましたが、LINQのバージョンはそうでなかったのです。 user.Groupsのタイプは何ですか?また、それが使用している等価比較関数についてどれだけ知っていますか?

+0

user.Groupsは、BindingList クラスに基づくカスタムタイプです。リストの等価コンパレータが違いを生み出す理由(要素ごとに要素が比較されないのはなぜですか?)に従うことはできませんが、にはカスタムがあります。 –

+0

申し訳ありませんが、誤解されています:user.GroupsはObservableCollection です。残りの部分は –

+0

@Sebastianの前に述べたように有効です。 'user.Groups'にカスタム同値比較関数がある場合、' Contains'にはIntersectとExceptで使用されるデフォルトの比較関数よりも異なる回答が返されます。 –

関連する問題