2011-12-08 147 views
1

我有兩個列表。兩個列表的類型都從相同的基本類型繼承。我想遍歷它們,並執行只使用基類的功能而沒有兩個基本相同的foreach循環的操作。迭代兩個繼承類(相同基類)的兩個列表

我不能將列表複製到另一個列表或類似的東西,因爲我需要在操作完成後單獨使用列表的原始形式。

有沒有辦法做到這一點,而不寫一個函數?

class Program 
{ 
    static void Main(string[] args) 
    { 
     // I have two lists of inherited classes 
     List<Babby1> list1 = returnBabby1(); 
     List<Babby2> list2 = returnBabby2(); 

     // I want to iterate through both, and do the same thing, which is a part 
     // of the base class functionality. 
     // Basically I want this to be a single foreach loop. 
     foreach (Babby1 item in list1) 
      item.var = 50; 

     foreach (Babby2 item in list2) 
      item.var = 50; 

     // I have to send them as separate lists, the type being the original (inherited) class 
     sendBabby1(list1); 
     sendBabby2(list2); 
    } 

    static void sendBabby1(List<Babby1> list) 
    { 
    } 

    static void sendBabby2(List<Babby2> list) 
    { 
    } 

    static List<Babby1> returnBabby1() 
    { 
     return new List<Babby1>(); 
    } 

    static List<Babby2> returnBabby2() 
    { 
     return new List<Babby2>(); 
    } 
} 

class Base 
{ 
    public int var; 
} 

class Babby1 : Base 
{ 
    public int var1; 
} 

class Babby2 : Base 
{ 
    public int var2; 
} 
+1

你有兩個單獨的列表,所以你不能沒有建立新的名單一一列舉爲一體。 – slugster

回答

6

這應該做的伎倆。 ..

foreach (var item in list1.Concat<Base>(list2)) 
{ 
    // Do your thing 
} 

編輯:我改變UnionConcat,因爲我認爲它」可能更合適。

+0

這很好,謝謝!使用Union會花費更長的時間(列表非常大),然後拋出OutOfMemory異常,但Concat完成這項工作。 – svinja

+0

'Union'將會比較列表中每個項目之間的相等性,而'Concat'只是...好吧......連接它們! –

+0

svinja,如果這解決了你的問題,請考慮接受它作爲答案......這將讓別人知道你的問題已經解決,並幫助他人找到解決方案,如果他們遇到類似的問題。 (這是這個答案旁邊的大勾號!) –

0

只需使用的基類,像這樣:

List<Babby> list = new List<Base>(); 
list.AddRange(returnBabby1()); 
list.AddRange(returnBabby2()); 

foreach (Base item in list) 
    item.var = 50; 

sendBabby1(list.OfType<Babby1>().ToList()); 
sendBabby2(list.OfType<Babby2>().ToList()); 

(當然,這假設你有你設置的基類中聲明的變量)

0

您可以使用IEnumerable<T>covariance爲了實現這一點,如果你打算簡單地遍歷列表和不在名單上添加項目或執行其他操作:

static SendBaby(IEnumerable<Base> list) 
{ 
    ... 
} 
... 
SendBaby(list1) 
SendBaby(list2) 
0

您可以使用一個for循環,用Count代替。 (如果做比較消耗額外的CPU週期。)

for(int i=0;i<baby1.Count||i<baby2.Count;i++) 
{ 
    if(baby1.Count<i) 
     baby1[i].field = 50; 
    if(baby2.Count<i) 
     baby2[i].field = 50; 
} 
0

這確實是相當不錯:

 var babies1 = new List<Baby1>(5); 
     for (int i = 0; i < 5; i++) 
     { 
      babies1.Add(new Baby1 { Name = "Babies1 " + i, Var1 = 1}); 
     } 

     var babies2 = new List<Baby2>(5); 
     for (int i = 0; i < 5; i++) 
     { 
      babies2.Add(new Baby2 { Name = "Babies2 " + i }); 
     } 

     foreach (Baby b in babies1.Union<Baby>(babies2)) 
     { 
      b.Var1 = 50; 
     } 

     foreach (var baby2 in babies2) 
     { 
      Console.WriteLine(baby2.Var1); 
     } 

     foreach (var baby1 in babies1) 
     { 
      Console.WriteLine(baby1.Var1); 
     } 
相關問題