2011-12-08 6 views
1

私は2つのリストを持っています。両方のリストの型は、同じ基本型から継承します。私はそれらを繰り返し、2つの基本的に同じforeachループを順番に持たずに基本クラスの機能を使う操作をしたい。(同じ基本クラスの)2つの継承クラスの2つのリストを反復する

リストが別のリストまたは何らかの並べ替えのものにコピーできません。操作が完了した後に元の形式でリストを別々に使用する必要があるためです。

機能を記述することなくこれを行う方法はありますか?

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

次の2つの別々のリストを持っているので、あなたは、新しいリストを作成せずに1として、それらを列挙することはできません。 – slugster

答えて

6

これはトリックを行う必要があります。 ..

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

編集:私はそれだと思うように私は」ConcatUnionを変更しましたおそらくもっと適切です。あなたは、単に項目を追加したり、リスト上の他の操作を実行リストを反復処理しないように計画している場合

+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を使用してください。

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

これはかなりよくそれをしない(。比較は、追加のCPUサイクルを消費しない場合):

 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); 
     }