如何对两个集合的交集中的每个项目进行自定义比较

Hak*_*rss 2 c# linq

如果我有:

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)

Mic*_*ito 5

您必须定义一个实现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"对应于左右集合中的元素.然后,您可以迭代结果以执行操作.