鉴于两个班级
class Contract
{
public int ID {get; set;}
// . . .
}
class DBContract
{
public int FromID {get; set;}
// . . .
}
Run Code Online (Sandbox Code Playgroud)
还有两个IEnumerables
IEnumerable<Contract> ValidContracts = Application.GetContracts(//. . .
IEnumerable<DBContract> ExportedContracts = DBAdapter.GetRows(// . . .
Run Code Online (Sandbox Code Playgroud)
我需要找到theces IEnumerables的交集.但是,如果它只有一个类型参数,我该如何实现IEqualityComparer呢?
为了对混合类型的集合进行操作,IEqualityComparer<T>类型参数T必须接受集合中所有类型的共同祖先.
既然Contract和DbContract看起来无关,并且不共享通用接口,则需要使用object通用基类.
这可能对您的目的来说太复杂了:也许您可以ID按如下方式实现交集:
var commonIds = new HashSet<int>(contracts.Select(c => c.Id));
commonIds.IntersectWith(dbContracts.Select(dbc => dbc.FromId));
Run Code Online (Sandbox Code Playgroud)
现在commonIds有IDs你需要的对象.Where在两侧运行简单的s将产生两个静态类型的交叉部分:
var commonContracts = contracts.Where(c => commonIds.Contains(c.Id));
var commonDbContracts = dbContracts.Where(dbc => commonIds.Contains(dbc.FromId));
Run Code Online (Sandbox Code Playgroud)
为什么不使用WhereandAny代替?它的性能不如Intersect,但它允许您以您想要的方式过滤:
var list = ExportedContracts.Where(ec => ValidContracts.Any(vc => vc.ID == ec.FromID));
Run Code Online (Sandbox Code Playgroud)
您不能IEqualityComparer在此处使用,因为该对象没有任何接口或基类(除了object)。