如果我有:
IEnumerable<CrewBase> crewBasesLeft;
IEnumerable<CrewBase> crewBasesRight;
并做:
IEnumerable<CrewBase> intersect = crewBasesLeft
.Intersect( crewBasesRight,CrewBaseComparer.OnId() );
如何得到:
CrewBase left;
CrewBase right;
来自:
intersect
这样我就可以遍历“相交”中的所有CrewBase并进行调用:
Action(left,right);
根据我实现的CrewBaseComparer.OnId,我只想在两个列表中都相等的CrewBases上执行此操作:
IEqualityComparer<CrewBase>
这是我当前的实现:
IEnumerable<ObjectDifference> GetCrewBaseDifferences2( TrafficPlan left, TrafficPlan right )
{
var result = new List<ObjectDifference>();
IEnumerable<CrewBase> intersect = left.CrewBases.Intersect( right.CrewBases,CrewBaseComparer.OnId() );
foreach( CrewBase crewBase in intersect )
{
CrewBase other = crewBase;
ObjectDifference diff = crewBase.GetDifference( right.CrewBases.First(x => x.Equals(other, CrewBaseComparer.OnId())) );
if( diff.HasDifferences )
{
result.Add( diff );
}
}
return result;
}
最佳答案
您必须定义一个实现IEqualityComparer的类:
class CustomComparer : IEqualityComparer<CrewBase>
{
#region IEqualityComparer<CrewBase> Members
public bool Equals(CrewBase x, CrewBase y)
{
return CustomCompare(x, y);
}
public int GetHashCode(CrewBase obj)
{
//a hash code based on the specific comparison
}
#endregion
}
然后调用与您的类的实例相交:
IEnumerable<CrewBase> intersect = crewBasesLeft.Intersect(crewBasesRight, new CustomComparer());
Intersect不一定总是分别将“ left”中的元素和“ right”中的元素分别作为参数“ x”和“ y”传递,但是从您的问题尚不清楚这是否重要。
根据您的更新,您似乎需要执行加入操作:
IEnumerable<CrewBase> crewBasesLeft;
IEnumerable<CrewBase> crewBasesRight;
var Join = crewBasesLeft.Join(crewBasesRight, left => left, right => right, (left, right) => new { left, right }, CrewBaseComparer.OnId());
foreach (var i in Join)
{
Action(i.left, i.right);
}
在此联接中,我们将每个元素都视为键,并使用您现有的自定义IEqualityComparer来比较实例。联接的结果选择器返回一个匿名类型,其匿名属性“ left”和“ right”对应于left和right集合中的元素。然后,您可以遍历结果以执行操作。
关于c# - 如何对两个集合相交的每个项目进行自定义比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1671208/