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()
の実装で
出典
2011-08-13 10:17:40
sll
を組み込みました。 "path"はオブジェクトの属性ではありませんか?ところで、あなたはLambdaComparerを知っていますか? – sll
[異なるオブジェクトを持つ2つのリストを交差させる]の複製が可能です(http://stackoverflow.com/questions/11285045/intersect-two-lists-with-different-objects) –