C# 使用Linq与子值相交?
我找到了这篇文章,它解释了如何使用Intersect在两个列表之间查找匹配元素 您可以使用它来匹配两个列表中不完全相同但具有要匹配的“子值”的元素吗 我的例子是:我有两个集合,每个集合都包含元素列表。一个包含名为C# 使用Linq与子值相交?,c#,.net,linq,c#-4.0,intersect,C#,.net,Linq,C# 4.0,Intersect,我找到了这篇文章,它解释了如何使用Intersect在两个列表之间查找匹配元素 您可以使用它来匹配两个列表中不完全相同但具有要匹配的“子值”的元素吗 我的例子是:我有两个集合,每个集合都包含元素列表。一个包含名为的元素,另一个包含名为的元素,每个元素都有名为“path”的属性,我要匹配的就是这个属性。如果路径属性相等,则需要匹配 在结果集中,我想要一个路径与元素路径匹配的所有元素的列表 如何做到这一点?我建议使用它作为相等比较器传递到Intersect()方法中,它允许通过提供布尔条件而不是每次
的元素,另一个包含名为
的元素,每个元素都有名为“path”的属性,我要匹配的就是这个属性。如果路径属性相等,则需要匹配
在结果集中,我想要一个路径与元素路径匹配的所有元素的列表
如何做到这一点?我建议使用它作为相等比较器传递到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));
在某些情况下,这可能会导致性能问题,因此我建议将其重构为:
public LambdaComparer(Func<T, T, bool> lambdaComparer) :
this(lambdaComparer,
EqualityComparer<T>.Default.GetHashCode(o))
{
}
public LambdaComparer(Func LambdaComparer):
这(lambdaComparer,
EqualityComparer.Default.GetHashCode(o))
{
}
所以它将使用内置的
GetHashCode()
implementation那么“path”是一个属性而不是对象的属性?顺便说一句,你知道LambdaComparer吗?在你的新建议中,GetHashCode(o)中的o值可能重复?当前链接到。
var resultSet = list1.Intersect<User>(
list2,
new LambdaComparer<User>((item1, item2) => userNameComparer));
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))
{
}