Как получить конкретный производный объект в список <T>? - PullRequest
7 голосов
/ 11 июня 2009

Допустим, у меня есть общий список Fruit (List<Fruit> fruits = new List<Fruit>()). Затем я добавляю пару объектов (все производные от Fruit) - Banana, Apple, Orange, но с различными свойствами для производных объектов (например, 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);

Тогда я могу сделать это:

foreach(Banana banana in fruits)
    Console.Write(banana.IsYellow);

Но во время выполнения, конечно, это недопустимо, потому что * * * * * * * * * * * * * * * * * * * * * *.

Как я могу получить только бананы, яблоки, апельсины и т.д. от List<Fruit>?

Ответы [ 5 ]

31 голосов
/ 11 июня 2009
foreach(Banana b in fruits.OfType<Banana>())
3 голосов
/ 11 июня 2009

Шаг 1: Сначала вы должны сделать подсписок из списка фруктов. Для создания подсписка используйте функцию Generic FindAll() и Predicate.

Шаг 2: Позже в подмножестве вы можете выполнить итерацию, которая содержит только «Банан»

Вот код

Step1:

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 голосов
/ 11 июня 2009

Вы могли бы просто сделать

foreach(Fruit fruit in fruits)
{
   Banana b = fruit as Banana;
   if(b != null)
   {
      Console.Write(b.IsYellow);
   }
}
1 голос
/ 11 июня 2009

добавление другого синтаксиса, хотя .OfType (), вероятно, лучший.

foreach (Banana b in fruits.Where(x => x is Banana))
1 голос
/ 11 июня 2009

Лично я считаю этот метод более читабельным:

foreach(Fruit fruit in fruits)
{
   if (fruit is Banana)
   {
      Banana b = fruit as Banana;
      Console.Write(b.IsYellow);
   }
   else if (fruit is Apple)
   {
      // ...
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...