2010-07-22 2 views
0

Как самый простой способ преобразования IList<T1> в IList<BaseT1>?Конвертировать IList <T1> в IList <BaseT1>

IList<T1>.Count() очень много !!!

class BaseT1 { }; 
class T1 : BaseT1 
{ 
    static public IList<BaseT1> convert(IList<T1> p) 
    { 
     IList<BaseT1> result = new List<BaseT1>(); 
     foreach (BaseT1 baseT1 in p) 
      result.Add(baseT1); 
     return result; 
    } 
} 
+0

IList = System.Collections.Generic.IList – SkyN

ответ

3

linq?

var baseList = derivedList.Cast<TBase>(); 

Edit:

Cast возвращает IEnumerable, вам нужно это в List? List может быть дорогой класс, чтобы иметь дело с

+0

IList = System.Collections.Generic.IList – SkyN

+1

'.ToList()' ... – BrunoLM

3

Вы получите гораздо лучшую производительность в своей реализации, если указать размер result списка, когда ее можно инициализировать, и вызвать метод Add на List<T> непосредственно:

List<BaseT1> result = new List<BaseT1>(p.Count); 

Таким образом, при добавлении новых элементов он не изменяет размер массива. Это должно привести к ускорению порядка.

В качестве альтернативы вы можете указать класс оболочки, который реализует IList<BaseT1>, и принимает конструктор IList<T1>.

+0

почему даже использовать список? просто используйте yield return –

+1

Потому что он хочет его в 'IList ', а не 'IEnumerable '. Linq - это не ответ на все. – thecoop

+0

вот-вот исправит это; ты слишком быстро! –

3
IList<T1>.Count() is very large number!!! 

Да, это означает, что независимо от того, какой синтаксис сахара вы используете, преобразование не будет требовать вывода хранения (п) и O (п). Вы не можете использовать этот список, чтобы избежать его повторного создания. Если это возможно, клиентский код может добавить элемент списка BaseT1 в список, нарушая обещание, что список содержит только объекты, совместимые с T1.

Единственный способ продвижения - вернуть тип интерфейса, который не может изменить список. В этом случае это будет IEnumerable<BaseT1>. Позволяя вам перебирать список, ничего больше. Это преобразование происходит автоматически в .NET 4.0 благодаря поддержке ковариации. Вам придется написать немного кода клея в более ранних версиях:

public static IEnumerable<BaseT1> enumerate(IList<T1> p) { 
     foreach (BaseT1 item in p) yield return item; 
    } 
Смежные вопросы