如果我有:
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中的<<或>>>是什么意思? - javaThis 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(...) { ... } } 我也有一些登录页面对…