You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中查找与指定List<string>匹配的抽象类子类

解决抽象类子类筛选中列表匹配的编译错误

问题分析

你遇到的编译错误根源在于:Enumerable.Any()方法需要一个Func<string, bool>类型的委托,但直接传入lookupList.Contains时,编译器无法确定要使用List<string>.Contains的哪个重载(该方法有两个重载:一个仅接收元素参数,另一个还接收相等比较器参数),导致类型匹配失败。

修正方案

以下两种方式都可以解决问题,逻辑等价且能满足你的需求:

方案1:显式用Lambda指定委托

通过Lambda表达式明确将Employees()返回的每个元素传入lookupList.Contains,让编译器确定正确的重载:

List<string> lookupList = new List<string>() { "Mary", "Peter" };
var matchingSubClasses = typeof(BaseClass).Assembly.GetTypes()
    .Where(t => t.IsSubclassOf(typeof(BaseClass)) && !t.IsAbstract)
    .Select(t => (BaseClass)Activator.CreateInstance(t))
    .Where(q => q.Employees().Any(emp => lookupList.Contains(emp)))
    .ToList();

方案2:用集合交集判断(更直观)

利用Intersect()方法直接判断两个列表是否存在共同元素,只要交集不为空即符合条件:

List<string> lookupList = new List<string>() { "Mary", "Peter" };
var matchingSubClasses = typeof(BaseClass).Assembly.GetTypes()
    .Where(t => t.IsSubclassOf(typeof(BaseClass)) && !t.IsAbstract)
    .Select(t => (BaseClass)Activator.CreateInstance(t))
    .Where(q => q.Employees().Intersect(lookupList).Any())
    .ToList();

额外优化

原代码中(q as BaseClass)是多余的,因为allSubClasses已经是BaseClass类型的实例集合,直接调用q.Employees()即可。

内容的提问来源于stack exchange,提问作者Cameron Castillo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 13:36:37