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

时间:2013-04-09 21:12:54

标签: c# types

我有以下定义:

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

这是正确的做法吗?我在程序的其他地方找不到错误。调试器向我显示实际通过的评估,但列表保持空白。

3 个答案:

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