linq 寻找符合List< string>属性与另一个List属性的所有子类(C#)

ruarlubt  于 2022-12-06  发布在  C#
关注(0)|答案(1)|浏览(151)

我试图找到一个抽象类的所有子类,这些子类在List<string>属性中具有与另一个List<string>匹配的匹配项。
关于标准属性(stringint等)的Stack Overflow有足够的例子,但这个列表似乎让我感到困惑。
下面是我的例子:

public abstract class BaseClass
{
    internal abstract List<string> Employees();
}

public class ChildClass : BaseClass
{
    internal override List<string> Employees()
    {
        return new List<string>() 
        { 
            "John",
            "Mary",
        };
    }   
}

现在,我想找到所有继承自BaseClass的子类,这些子类在预定义字符串中包含Employee名称。

List<string> lookupList = new List<string>() { "Mary", "Peter" };
var allSubClasses = typeof(BaseClass)
                    Assembly.GetTypes()
                    .Where(t => t.IsSubclassOf(typeof(BaseClass)) && !t.IsAbstract)
                    .Select(t => (BaseClass)Activator.CreateInstance(t));
var matchingSubClasses = (from q in allSubClasses
                          where (q as BaseClass).Employees().Any(lookupList)  //Compile error on this line
                          select (q as BaseClass)).ToList();

这将返回我的ChildClass,因为雇员姓名“玛丽”出现在查找列表中。
我在指示的行中收到编译器错误:
无法从“系统.集合.泛型.列表”转换为“系统.函数”
虽然这个错误是有道理的,但我似乎找不到修复它的方法:(

gorkyyrv

gorkyyrv1#

要检查对象的Employees列表中是否出现lookupList,可以使用

Employees().Intersect(lookupList).Any()

说明:这确定了两个列表的交集(即,在两者中都出现的元素),并且检查该交集是否包含任何元素。
因此,这将适用于您的情况:

var matchingSubClasses = (from q in allSubClasses
                          where q.Employees().Intersect(lookupList).Any()
                          select (q as BaseClass)).ToList();

相关问题