如何在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
相关产品推荐
相关产品推荐

