2

我有以下定义:

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

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

4

3 回答 3

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>());
于 2013-04-09T21:17:29.540 回答
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 {}
于 2013-04-09T21:18:39.290 回答
1

您可以使用 LINQ:

var ofB = listOfObjects.OfType<B>().ToList();
var ofC = listOfObjects.OfType<C>().ToList();
var ofA = listOfObjects.Except(ofB).Except(ofC).ToList();
于 2013-04-09T21:19:57.973 回答