IEqualityComparer对不同类型

Dmi*_*hin 4 c# linq

鉴于两个班级

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呢?

das*_*ght 6

为了对混合类型的集合进行操作,IEqualityComparer<T>类型参数T必须接受集合中所有类型的共同祖先.

既然ContractDbContract看起来无关,并且不共享通用接口,则需要使用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)

现在commonIdsIDs你需要的对象.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)


Pat*_*man 5

为什么不使用WhereandAny代替?它的性能不如Intersect,但它允许您以您想要的方式过滤:

var list = ExportedContracts.Where(ec => ValidContracts.Any(vc => vc.ID == ec.FromID));
Run Code Online (Sandbox Code Playgroud)

您不能IEqualityComparer在此处使用,因为该对象没有任何接口或基类(除了object)。