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

如果我有:

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集合中的元素。然后,您可以遍历结果以执行操作。

将谓词<T>转换为Func <T,bool> - c#

我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…

如何在Collection <T>上使用ToList - c#

MSDN documentation表示类Collection<T>在扩展部分中具有方法ToList()。如何使用这种方法? 参考方案 该文档有点误导。类型Collection<T>没有直接使用此方法。相反,它被定义为System.Linq.Enumerable上的扩展方法。为using添加System.Linq指令应该可以解决此问题…

Java中的<<或>>>是什么意思? - java

This question already has answers here: Closed 7 years ago. Possible Duplicate: What does >> and >>> mean in Java?我在一些Java代码中遇到了一些陌生的符号,尽管代码可以正确编译和运行,但对于括号在此代码中的作用却感…

通过Maven编译器插件不会发生有限的包含和排除 - java

我正在使用3.6.0版的maven编译器插件,在此我们只想在特定文件夹中编译一个文件,而在该位置编译所有其他文件。例如:在文件夹应用程序中有14个文件,从那我只希望编译1个文件,但它编译了所有文件,如果我要排除,则它也不起作用。 <sourceDirectory>${basedir}/../src/java</sourceDirectory…

当我所有的都是T时,如何返回Interface <T>的实例? - java

我有一个界面:public interface ILoginResult<T> { public T get(); } 我有一个LoginPage对象:public class LoginPage<T> { ... public ILoginResult<T> login(...) { ... } } 我也有一些登录页面对…