2012-07-08 57 views
4

我有一個多維列表:使用一個以上的對象中的foreach雖然迭代循環

List<string>[] list = new List<string>[2]; 
    list[0] = new List<string>(); 
    list[1] = new List<string>(); 

我迭代雖然名單如下 - 而是通過一個列表這隻迭代:

foreach (String str in dbConnectObject.Select()[0]) 
{ 
    Console.WriteLine(str); 
} 

雖然我希望能夠做一些事情,如:

foreach (String str in dbConnectObject.Select()[0] & String str2 in dbConnectObject.Select()[1]) 
{ 
    Console.WriteLine(str + str2); 
} 

回答

6

如果列表是相同的大小,可以我們ËEnumerable.Zip

foreach (var p in dbConnectObject.Select()[0].Zip(dbConnectObject.Select()[1], (a,b) => new {First = a, Second = b})) { 
    Console.Writeline("{0} {1}", p.First, p.Second); 
} 
2

如果你想通過這兩個列表順序迭代,你可以使用IEnumerable<T>.Union(IEnumerable<T>) extension method

IEnumerable<string> union = list[0].Union(list[1]); 

foreach(string str int union) 
{ 
    DoSomething(str); 
} 

如果你想組合的矩陣,你可以加入列表:

var joined = from str1 in list[0] 
      from str2 in list[1] 
      select new { str1, str2}; 


foreach(var combination in joined) 
{ 
    //DoSomethingWith(combination.str1, combination.str2); 
    Console.WriteLine(str + str2); 
} 
+1

'Union'將排除返回集中的重複。我不認爲這是需要的。雖然'Zip'可能更適合,我寧願'Concat'。 – 2012-07-08 12:26:08

0

您可以嘗試下面的代碼。如果尺寸不同,它也可以工作。

for (int i = 0; i < list[0].Count; i++) 
{ 
    var str0 = list[0][i]; 
    Console.WriteLine(str0); 
    if (list[1].Count > i) 
    { 
     var str1 = list[1][i]; 
     Console.WriteLine(str1); 
    } 
} 
+0

有時一個很好的舊雙循環可以足夠:) – 2012-07-08 12:18:25

+0

爲什麼在純'Lists'上使用'Enumerable'擴展方法? ('Count()'代替Count,'ElementAt'代替索引器) – 2012-07-08 12:23:56

+0

@TimSchmelter好點! – Adam 2012-07-08 12:40:31

-1

使用LINQ來代替:

foreach (var s in list.SelectMany(l => l)) { Console.WriteLine(s); }

+0

Th不會將兩個列表相互連接。 – 2012-07-08 12:22:30