如果我有:
IEnumerable<CrewBase> crewBasesLeft;
IEnumerable<CrewBase> crewBasesRight;
Run Code Online (Sandbox Code Playgroud)
并做:
IEnumerable<CrewBase> intersect = crewBasesLeft
.Intersect( crewBasesRight,CrewBaseComparer.OnId() );
Run Code Online (Sandbox Code Playgroud)
如何得到:
CrewBase left;
CrewBase right;
Run Code Online (Sandbox Code Playgroud)
来自:
intersect
Run Code Online (Sandbox Code Playgroud)
所以我可以遍历Intersect中的所有CrewBases并拨打电话:
Action(left,right);
Run Code Online (Sandbox Code Playgroud)
我只想根据我的CrewBaseComparer.OnId在两个列表中相同的CrewBases上执行此操作:
IEqualityComparer<CrewBase>
Run Code Online (Sandbox Code Playgroud)
这是我目前的实施:
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;
}
Run Code Online (Sandbox Code Playgroud)
您必须定义一个实现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
}
Run Code Online (Sandbox Code Playgroud)
然后使用您的类的实例调用Intersect:
IEnumerable<CrewBase> intersect = crewBasesLeft.Intersect(crewBasesRight, new CustomComparer());
Run Code Online (Sandbox Code Playgroud)
并不一定是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);
}
Run Code Online (Sandbox Code Playgroud)
在此连接中,我们将每个元素视为键,并使用现有的自定义IEqualityComparer来比较实例.连接的结果选择器返回一个匿名类型,其属性"left"和"right"对应于左右集合中的元素.然后,您可以迭代结果以执行操作.
| 归档时间: |
|
| 查看次数: |
2308 次 |
| 最近记录: |