我有以下定义:
class X {
private ICollection<A> listOfObjects;
}
class A
class B : A
class C : A
现在我想拆分这个对象列表,并为每种类型创建单独的列表。 我认为我提出的解决方案就足够了,但是我的列表永远不会被填充。我忽略了什么吗?
foreach (var obj in listOfObjects) {
if (obj.getType() == typeof(B)) {
SomeList.Add((B) obj);
} else if (obj.GetType() == typeof(C)) {
AnotherList.Add((C) obj);
}
}
这是正确的做法吗?我在程序的其他地方找不到错误。调试器向我显示实际通过的评估,但列表保持空白。
答案 0 :(得分:2)
使用与.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>());
答案 1 :(得分:2)
试试这个:
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 {}
答案 2 :(得分:1)
您可以使用LINQ:
var ofB = listOfObjects.OfType<B>().ToList();
var ofC = listOfObjects.OfType<C>().ToList();
var ofA = listOfObjects.Except(ofB).Except(ofC).ToList();