2011-08-13 4 views
1

この投稿が見つかりましたMatch elements between 2 collections with Linq in c#どのように2つのリストの間で一致する要素を見つけるためにIntersectを使用することができます説明しました。Linqをサブ値と交差させる?

正確には同じではないが、 "サブ値"が一致する2つのリストの要素を一致させるためにこれを使用できますか?

私の例は次のとおりです。2つのコレクションがあり、それぞれにXElementsのリストが含まれています。 <link>と呼ばれる要素と<file>と呼ばれる要素を持つ要素のそれぞれには、「パス」という属性があります。これは、一致させたい属性です。パス属性が等しい場合は、一致が必要です。

結果セットでは、パスが要素のパスと一致するすべての要素の一覧が必要です。

どうすればいいですか?

+0

を組み込みました。 "path"はオブジェクトの属性ではありませんか?ところで、あなたはLambdaComparerを知っていますか? – sll

+0

[異なるオブジェクトを持つ2つのリストを交差させる]の複製が可能です(http://stackoverflow.com/questions/11285045/intersect-two-lists-with-different-objects) –

答えて

2

Intersect()メソッドにEquality Comparerとして渡すことができるLambdaComparerを使用することをお勧めします。これにより、毎回新しい比較クラスを導入する代わりにブール条件を指定して比較ロジックを指定できるので、

firstCollection.Intersect(
       secondCollection, 
       new LambdaComparer<YourClass>(
        (item1, item2) => item1.PropertyName == item2.PropertyName)); 


// Below are lists and User class which demonstrates LambdaComparer and Intersect() 
public class User 
{ 
     public string Name { get; set; } 
} 

IList<User> list1 = new List<User> 
     { 
      new User {Name = "A"}, 
      new User { Name = "B"} 
     }; 
List<User> list2 = new List<User> 
     { 
      new User {Name = "C"}, 
      new User { Name = "B"} 
     }; 

var resultSet = list1.Intersect<User>(
     list2, 
     new LambdaComparer<User>((item1, item2) => item1.Name == item2.Name)); 

あなたはcusotmの属性を比較する必要がある場合は基本的に、あなたはまだ

Func<User, User, bool> userNameComparer = (user1, user2) => 
{ 
// check attributes using user1.GetType().GetCustomAttributes() 
}; 

にこのロジックをカプセル化することができます。そして、この比較演算のfuncitonを使用します。

var resultSet = list1.Intersect<User>(
        list2, 
        new LambdaComparer<User>((item1, item2) => userNameComparer)); 

EDIT:この回答 で参照注ragarding特定impelemntaionハッシュfuncitonのデフォルトが0

6 public LambdaComparer(Func<T, T, bool> lambdaComparer) : 
7    this(lambdaComparer, o => 0) 
8   { 
9   } 

をハードコードされたことにより、これにはいくつかのパフォーマンス上の問題につながる可能性という問題である可能性がありますケースをリファクタリングすることをおすすめします。

public LambdaComparer(Func<T, T, bool> lambdaComparer) : 
       this(lambdaComparer, 
         EqualityComparer<T>.Default.GetHashCode(o)) 
      { 
      } 

GetHashCode()の実装で

+0

+1は 'LambdaComparer'を指摘するために+1します。役に立つと思う。 –

+0

ありがとう、良いヒント! – Anders

+0

@アンダースベンソン:EDITパートを参照してください。 – sll

関連する問題