如何在List <t>?</t>中获取特定的派生对象

时间:2009-06-11 13:15:24

标签: c# .net list collections filter

假设我有一个FruitList<Fruit> fruits = new List<Fruit>())的通用列表。然后我添加了几个对象(所有对象都来自Fruit) - BananaAppleOrange但在派生对象上具有不同的属性(例如{{1} })。

Banana.IsYellow

然后我可以这样做:

List<Fruit> fruits = new List<Fruit>();
Banana banana1 = new Banana();
Banana banana2 = new Banana();
Apple apple1 = new Apple();
Orange orange2 = new Orange();

fruits.Add(banana1);
fruits.Add(banana2);
fruits.Add(apple1);
fruits.Add(orange1);

但是在执行时当然这是无效的,因为Apple和Orange对象上没有foreach(Banana banana in fruits) Console.Write(banana.IsYellow); - 属性。

如何从IsYellow

中仅获取香蕉,苹果,橙子等

5 个答案:

答案 0 :(得分:31)

foreach(Banana b in fruits.OfType<Banana>())

答案 1 :(得分:3)

你可以做到

foreach(Fruit fruit in fruits)
{
   Banana b = fruit as Banana;
   if(b != null)
   {
      Console.Write(b.IsYellow);
   }
}

答案 2 :(得分:3)

第1步: 首先,您应该从Fruit列表中创建子列表。要使子列表使用Generic的FindAll()Predicate函数。

第2步: 之后,在子集中,您可以迭代,其中仅包含'Banana'

这是代码

第1步:

List<Fruit> fruits = new List<Fruit>();
Banana banana1 = new Banana();
Banana banana2 = new Banana();
Apple apple1 = new Apple();
Orange orange1 = new Orange();

fruits.Add(banana1);
fruits.Add(banana2);
fruits.Add(apple1);
fruits.Add(orange1);

//Extract Banana from fruit list
List<Fruit> bananaComb = fruits.FindAll(IsBanana);

//Now iterate without worring about which fruit it is
foreach (Fruit fruit in bananaComb)
{
    Console.WriteLine(((Banana)fruit).IsYellow);
}

第2步: 这是谓词函数

//A Predicate function to determine whether its a Banana
static protected bool IsBanana(Fruit aFruit)
{
    return aFruit.GetType().Name == "Banana" ? true : false;
}

答案 3 :(得分:1)

就个人而言,我觉得这种方法更具可读性:

foreach(Fruit fruit in fruits)
{
   if (fruit is Banana)
   {
      Banana b = fruit as Banana;
      Console.Write(b.IsYellow);
   }
   else if (fruit is Apple)
   {
      // ...
   }
}

答案 4 :(得分:1)

添加另一种语法,但.OfType&lt;香蕉&gt;()可能是最好的。

foreach (Banana b in fruits.Where(x => x is Banana))