Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查基类型列表是否至少包含一个子类型的实例_C# - Fatal编程技术网

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-不是直接添加的。您必须创建一个包装器或一个方法来添加可以约束输入的类型。