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();