2012-02-14 3 views
3

Мне нужно преобразовать запрос linq из общего ienumerable в arraylist.Преобразование родового ienumerable в arraylist

ArrayList myArrayList = new ArrayList(); 
     var b = 
       (from myObj in myCollection 
      select new myClass 
      { 
      Name = myObj.Name, 
      ac = myObj.ac 
      }); 

Я попытался сделать

b.Cast<ArrayList>(); 

, но он не работает.

Отредактировано: Я получил это работает с @devdigital раствором

, но я также хочу отметить, что в том же самое время я нашел хак решения.

myArrayList.InsertRange(0, b.ToArray()); 
+0

'новый ArrayList (б);' ' –

+0

Литой ' расширение отбрасывает каждый элемент 'IEnumerable' и возвращает их в качестве еще одного' IEnumerable'. Поэтому нецелесообразно преобразовывать коллекцию. –

ответ

14

Один из конструкторов для ArrayList типа принимает ICollection, так что вы должны быть в состоянии сделать следующее:

var b = 
    (from myObj in myCollection 
    select new myClass 
    { 
     Name = myObj.Name, 
     ac = myObj.ac 
    }).ToArray(); 

ArrayList myArrayList = new ArrayList(b); 
+1

Не 'ArrayList' нуждается в' ICollection'? http://msdn.microsoft.com/en-us/library/system.collections.arraylist.aspx –

+0

Нет - http://msdn.microsoft.com/en-us/library/w53b5hb0.aspx – devdigital

+0

Да, но это без параметров. Я хотел бы указать, что 'ArrayList (IEnumerable)' не существует. –

4

Я предлагаю вам использовать List<T>, а не ArrayList. Вы можете использовать метод ToList расширения или тому List «s constructor which takes an IEnumerable<T>:

var myList = b.ToList(); // either 
var myListTwo = new List<myClass>(b); // or 

List<T> была вновь введена с .NET 2.0 и является универсальным. Это означает, что он дает вам значения вашего фактического типа во время компиляции, которое равно myClass, а не object.

Edit: Если вы на самом деле нужен ArrayList, вам нужно скопировать b дважды, так как она не может справиться с IEnumerable напрямую, а devdigital pointed out in his reply:

ArrayList arrayList = new ArrayList(b.ToArray()); 
+4

Я предполагаю, что ему нужен ArrayList для некоторых устаревших API. – devdigital

+0

ОК спасибо, отредактировал мой пост. –

+0

@devdigital да, правильно я использую API –

2

Вы можете конвертировать ваши IEnumerable в массив с ToArray() , затем постройте ArrayList из этого массива.

var b = (from myObj in myCollection 
     select new myClass 
     { 
      Name = myObj.Name, 
      ac = myObj.ac 
     }); 
var myArrayList = new ArrayList(b.ToArray()); 
Смежные вопросы