c# - 如何对两个集合相交的每个项目进行自定义比较

标签 c# linq

如果我有:

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/

相关文章:

c# - 如何在 asp.net 网络表单中显示 pdf 文件

c# - 无法隐式转换类型 'System.Collections.Generic.IEnumerable Cast 错误

c# - 无法在 LINQ to Entities 查询中初始化实现 IEnumerable 'System.Collections.Generic.List` 1' 的类型

.net - 表达式树中的类似运算符

entity-framework - 将日期时间转换为 LINQ-to-entities 查询中的格式化字符串

c# - 有用于 Java 的 RTSJ - 是否有可与 C# 相媲美的东西?

c# - "The Type or namespace ' AjaxControlToolkit' 无法找到...”的解决方案是什么?

c# - 上次。等待与线程一起工作吗?

c# - LINQ to Entities 无法识别方法 'Boolean ToBoolean

c# - Linq、OrderByDescending、First 和邪恶的 DefaultIfEmpty