2014-09-25 3 views
1

Я пытаюсь сериализация каждого объекта за каждую коллекцию списка внутри общего список Object sКак перебирать список в общем списке

В качестве примера я могу перебирать каждый объект списка alist внутри родовой список temp_list, но так как я не знаю, что v объекта до времени выполнения я не могу ссылаться на свой список:

List<AObj> alist = new List<AObj>(); 
List<BObj> blist = new List<BObj>(); 

// .. objects initialized here, plugged into respective lists, etc. 

List<Object> temp_list = new List<Object>(); 
temp_list.Add(alist); 
temp_list.Add(blist); 

foreach (var v in temp_list) 
{ 
    // Here I want to iterate through the list in each v 
    /* 
    foreach (var w in v) <-- This obviously doesn't work because the compiler 
          doesn't know what v is until run-time 
    */ 
} 

Где alist и blist имеют только основные объекты:

class AObj 
{ 
    public string Property1 { get; set; } 
    public string Property2 { get; set; } 
} 

class BObj 
{ 
    public string Property3 { get; set; } 
    public string Property4 { get; set; }  
} 

Есть ли способ, которым я могу иметь двойной foreach, который позволит мне проходить через каждый объект в списке, который находится в общем списке.

Поскольку компилятор не знает v до времени выполнения, он довольно сильно застрял в подвешенном состоянии.

ответ

1

, если вы уверены, что это то iteratable литье будет работать

например

foreach (var v in temp_list) 
{ 
    // Here I want to iterate through the list in each v 
    foreach (var w in v as IEnumerable) //casting to IEnumerable will let you iterate 
    { 
     //your logic 
    } 
} 

в качестве альтернативы вы можете изменить внешний вид списка, чтобы избежать литья

из

List<Object> temp_list = new List<Object>(); 

-

List<IEnumerable> temp_list = new List<IEnumerable>(); 

, если это невозможно, то, возможно, добавив проверку перед итерация должна сделать код безопасным

foreach (var v in temp_list) 
{ 
    // Here I want to iterate through the list in each v 
    //casting to IEnumerable will let you iterate 
    IEnumerable list = v as IEnumerable; 
    //check if successful 
    if(list != null) 
    { 
     foreach (var w in list) 
     { 
      //your logic 
     } 
    } 
    else 
    { 
     //else part if needed 
    } 
} 
0

Вы должны объявить список временного как список IEnumerable<object>, вместо object. Это делается следующим образом:

var alist = new List<AObj>(); 
var blist = new List<BObj>(); 

// .. objects initialized here, plugged into respective lists, etc. 

var temp_list = new List<IEnumerable<object>>(); 

temp_list.Add(alist); 
temp_list.Add(blist); 

foreach (var v in temp_list) 
{ 
    foreach (var x in v) 
    { 

    } 
} 
0

Использование LINQ ...

List<AObj> alist = new List<AObj>(); 
List<BObj> blist = new List<BObj>(); 

// .. objects initialized here, plugged into respective lists, etc. 

List<object> temp_list = new List<object>(); 

temp_list.Add(alist); 
temp_list.Add(blist); 

var allObjects = temp_list 
    .Select(l => l as IEnumerable<object>) // try to cast to IEnumerable<object> 
    .Where(l => l != null)     // filter failed casts 
    .SelectMany(l => l);     // transform the list of lists into a single sequence of objects 

foreach (var o in allObjects) 
{ 
    // enumerates objects in alist and blist. 
} 
Смежные вопросы