假设我有一个Fruit
(List<Fruit> fruits = new List<Fruit>()
)的通用列表。然后我添加了几个对象(所有对象都来自Fruit
) - Banana
,Apple
,Orange
但在派生对象上具有不同的属性(例如{{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
?
答案 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))