1

この投稿Match elements between 2 collections with Linq in c#を見つけました.これは、Intersectを使用して2つのリスト間で一致する要素を見つける方法を説明しています.

これを使用して、まったく同じではないが、一致させたい「サブ値」を持つ 2 つのリストの要素を一致させることができますか?

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

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

これはどのように行うことができますか?

4

1 に答える 1

2

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

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()
};

そして、この比較機能を次のように使用します。

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

編集:この回答で参照されている特定の実装に注意してください 。デフォルトでは、ハッシュ機能がハードコードされているという問題がある可能性があります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()実装を使用します

于 2011-08-13T10:17:40.243 に答える