2011-12-08 145 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); 
     } 
相关问题