В C #, можно ли пройти через несколько коллекций одного базового типа? - PullRequest
3 голосов
/ 27 апреля 2011

Предположим, что классы 'Apple', 'Banana' и 'Orange' все наследуются от 'Fruit'.

Теперь предположим, что у нас есть списки переменных-членов -

List<Apple> mApples; 

List<Banana> mBananas; 

List<Orange> mOranges;  

Можем ли мы сформироватьцикл, который делает что-то эквивалентное следующему?

foreach( Fruit fruit in mApples, mBananas, mOranges )  
{   
   fruit.Slice();   
}

Я использую .net 2.0.

Ответы [ 2 ]

4 голосов
/ 27 апреля 2011

Вы должны объединить списки

foreach(Fruit fruit in mApples.Cast<Fruit>()
        .Concat(mBananas.Cast<Fruit>())
        .Concat(mOranges.Cast<Fruit>()))
{
    fruit.Slice();
}

Редактировать

Это было бы возможным решением 2.0

    foreach(Fruit fruit in Concat<Fruit>(mApples, mBananas, mOranges))
    {
        fruit.Slice();
    }

    public static IEnumerable<T> Concat<T>(params IEnumerable<T>[] arr)
    {
        foreach (IEnumerable col in arr)
        foreach (T item in col)
            yield return item;
    }
3 голосов
/ 27 апреля 2011
ArrayList list = new ArrayList();
list.AddRange( mApples );
list.AddRange( mBananas );
list.AddRange( mOranges );

foreach( Fruit item in list )
{
    item.Slice();
}
...