Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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#_Types - Fatal编程技术网

C# 将超类型数组拆分为子类型数组

C# 将超类型数组拆分为子类型数组,c#,types,C#,Types,我有以下定义: class X { private ICollection<A> listOfObjects; } class A class B : A class C : A 这是正确的方法吗?我在程序的其他地方找不到错误。调试器向我显示了实际通过的求值,但列表仍然为空。使用类型比较与.GetType()和/或typeof()通常是一种不好的做法。相反,您应该尝试: foreach (var obj in listOfObjects) { if (obj

我有以下定义:

class X {
    private ICollection<A> listOfObjects;
}

class A

class B : A 

class C : A

这是正确的方法吗?我在程序的其他地方找不到错误。调试器向我显示了实际通过的求值,但列表仍然为空。

使用类型比较与
.GetType()
和/或
typeof()
通常是一种不好的做法。相反,您应该尝试:

foreach (var obj in listOfObjects) {
    if (obj is B) {
         SomeList.Add((B) obj);
    } else if (obj is C) {
         AnotherList.Add((C) obj);
    }
}
但是您也可以跳过
foreach
循环并执行以下操作:

SomeList.AddRange(listOfObjects.OfType<B>());
AnotherList.AddRange(listOfObjects.OfType<C>());
SomeList.AddRange(listofObject.OfType());
另一个list.AddRange(listofObject.OfType());
试试这个:

  class X {
      private ICollection<A> listOfObjects;

    public List<B> GetBs() {
      return  listOfObjects.OfType<B>().ToList();
    }
    public List<C> GetCs() {
      return listOfObjects.OfType<C>().ToList();
    }
  }

  class A {}

  class B : A {}

  class C : A {}
X类{
私有ICollection对象列表;
公共列表GetBs(){
返回listofObject.OfType().ToList();
}
公共列表GetCs(){
返回listofObject.OfType().ToList();
}
}
A类{}
B类:A{}
C类:A{}
您可以使用LINQ:

var ofB = listOfObjects.OfType<B>().ToList();
var ofC = listOfObjects.OfType<C>().ToList();
var ofA = listOfObjects.Except(ofB).Except(ofC).ToList();
var ofB=listOfObjects.OfType().ToList();
var ofC=listOfObjects.OfType().ToList();
var ofA=listOfObjects.Except(ofB).Except(ofC.ToList();

您是否尝试过
listOfObjects.GroupBy(x=>x.GetType())
?您说评估通过了。您是否使用调试器来观察
if
语句之前、期间和之后的列表内容?也许还有别的东西在重置它们。出于好奇,
使用与.GetType()和/或typeof()的类型比较通常是一种不好的做法
为什么?我想问一下与I4V相同的问题,你能解释一下吗?我已经研究过你的解决方案,但收到了警告。我已经解决了这个问题,首先尝试了其他评论中建议的不同方法。@I4V,因为它相当粗糙。您正在检索两个类型对象并比较它们,而不是使用内置的语言构造。但更重要的是,
GetType()==typeof()
方法无法正确观察类关系(多态性)。如果您有从
B
继承的第四个类
D
,以及类型为
D
的对象
dObj
,则
dObj是B
将正确计算为
true
,但
dObj.GetType()==typeof(B)
将评估为
false
@jeroenvanevel我建议的两种方法中的哪一种产生了警告(警告是什么?)。我提出的第二种方法与Marcin和Pieter的非常相似,我在他们前面稍微回答了一下,OP想要做的是显而易见的。那么他/她是否真的需要这个(
,但更重要的是,GetType()==typeof()方法无法正确观察类关系(多态性)
)我遵循了您和Marcin提供的建议,这非常有效,非常感谢!
var ofB = listOfObjects.OfType<B>().ToList();
var ofC = listOfObjects.OfType<C>().ToList();
var ofA = listOfObjects.Except(ofB).Except(ofC).ToList();