C# 如何检查基类型列表是否至少包含一个子类型的实例
我有这样一个基类列表:C# 如何检查基类型列表是否至少包含一个子类型的实例,c#,C#,我有这样一个基类列表: List<BaseClass> ChildClasses class ChildFoo : BaseClass {} class ChildBar : BaseClass {} class ChildBaz : BaseClass {} class ChildQax : BaseClass {} class ChildBox : BaseClass {} ... List<BaseClass> baseClasses = new Lis
List<BaseClass> ChildClasses
class ChildFoo : BaseClass {}
class ChildBar : BaseClass {}
class ChildBaz : BaseClass {}
class ChildQax : BaseClass {}
class ChildBox : BaseClass {}
...
List<BaseClass> baseClasses = new List<BaseClass>();
baseClasses.Add(new ChildFoo());
baseClasses.Add(new ChildBar());
//Population code here...
var result = ContainsTypes(baseClasses, typeof(ChildFoo), typeof(ChildBar));
我需要实现一个方法,该方法可以查询ChildClasses
列表,以查看它是否具有我传递给它的所有类型,这些类型都来自BaseClass
因此,如果我为类型ChildFoo
和ChildBar
调用此方法,那么如果ChildClasses
列表至少包含一个ChildFoo
和ChildBar
的实例,则应返回true
我如何处理这种情况
如果ChildClasses列表至少包含一个ChildFoo和ChildBar实例,则应返回true
你可以用它。然后可以多次组合表达式
var containsFooAndBar = ChildClasses.OfType<ChildFoo>().Any()
&& ChildClasses.OfType<ChildBar>().Any();
假设继承层次结构没有比您的示例更深入 创建列表中实际类型的哈希集:
var actualTypes= new HashSet<Type>(ChildClasses.Select(x=>x.GetType()));
如果requiredTypes.Count==0
,则列表包含所有必需的类型。如果requiredTypes.Count>0
则缺少类型,这些类型将作为requiredTypes
的内容保留
如果所需类型的数量是可变的(让调用者直接传入一个哈希集或一个IEnumerable,您可以从中构造哈希集),并且对于子类或所需类型中的大量项执行,那么这种方法应该更容易实现。您可以创建一个方法,该方法接受您的类列表,以及类型数组,然后检查提供的列表是否包含所有这些类型:
static bool ContainsTypes(List<BaseClass> list, params Type[] types)
{
return types.All(type => list.Any(x => x != null && type == x.GetType()));
}
静态bool ContainsTypes(列表,参数类型[]类型)
{
返回types.All(type=>list.Any(x=>x!=null&&type==x.GetType());
}
并按如下方式实施:
List<BaseClass> ChildClasses
class ChildFoo : BaseClass {}
class ChildBar : BaseClass {}
class ChildBaz : BaseClass {}
class ChildQax : BaseClass {}
class ChildBox : BaseClass {}
...
List<BaseClass> baseClasses = new List<BaseClass>();
baseClasses.Add(new ChildFoo());
baseClasses.Add(new ChildBar());
//Population code here...
var result = ContainsTypes(baseClasses, typeof(ChildFoo), typeof(ChildBar));
List baseClasses=new List();
添加(新的ChildFoo());
添加(新的ChildBar());
//这里的人口编码。。。
var result=ContainsTypes(基类、typeof(ChildFoo)、typeof(ChildBar));
或者如果要使用扩展方法
public static class Extensions
{
public static bool ContainsTypes(this List<BaseClass> list, params Type[] types)
{
return types.All(type => list.Any(x => x != null && type == x.GetType()));
}
}
公共静态类扩展
{
公共静态bool ContainsTypes(此列表,参数类型[]类型)
{
返回types.All(type=>list.Any(x=>x!=null&&type==x.GetType());
}
}
再一次,像这样实施:
List<BaseClass> baseClasses = new List<BaseClass>();
baseClasses.Add(new ChildFoo());
baseClasses.Add(new ChildBar());
//Population code here...
var result = baseClasses.ContainsTypes(typeof(ChildFoo), typeof(ChildBar));
List baseClasses=new List();
添加(新的ChildFoo());
添加(新的ChildBar());
//这里的人口编码。。。
var result=baseClasses.ContainsTypes(typeof(ChildFoo),typeof(ChildBar));
类似这样的内容:bool result=ChildClasses.All(item=>item!=null&&item是ChildFoo)代码>?是否有方法将mandatoryTypes
的元素约束到BaseClass
的子级?因此,只有从基类派生的类型才能添加到那里。@S.Tarıkıetin-不是直接添加的。您必须创建一个包装器或一个方法来添加可以约束输入的类型。