2016-04-07 110 views
1

我試圖讓每個值都打印一次:嵌套循環獲取每個

就像這樣。

讓我們假裝對象letters包含「一,二......十」

然後是包含對象numbers「1,2,3,4 ...... 10」

現在,如果我想要打印循環:

One 
1 
Two 
2 
Three 
3 

循環如何看起來像?

我想它是這樣的:

 foreach (var i in letters) 
{ 
     Console.WriteLine(i); 

    foreach(var a in numbers) 
     { 
      Console.WriteLine(a); 
     } 
} 

但這返回:

One 
1 
2 
Two 
1 
2 
Three 
1 
2 

而這結果不是我想要的..

我怎麼能窩循環來讓它按我想要的方式打印?

+1

你能顯示對象字母/數字 – fubo

+1

重複:http://stackoverflow.com/questions/1955766/iterate-two-lists-or-arrays-with-one-foreach-statement-in-c-sharp –

+0

@ Simon.S這已經開放很久了。如果其中一個答案解決了您的問題,請接受該答案,以便讓那些尋找類似答案的人更加清楚。 –

回答

3

使用for循環insted的的foreach使用這樣

for (int i=0;i<letters.length;i++) 
{ 
    Console.WriteLine(letters[i]); 
    Console.WriteLine(numbers[i]); 
} 
+0

打我吧。在這種情況下,嵌套循環不是必需的。 – levelonehuman

+2

如果'letters.Count' =='numbers.Count' - 否則'我 fubo

0

你接近 - 第二循環不應當在第一,但你應該使用一個循環來兩個數組遍歷。嘗試:

for (int i = 0; i < letters.size(); i++) { 
Console.WriteLine(letters.getItem(i)); 
Console.WriteLine(numbers.getItem(i)); 
} 

注意,這是假定大小()方法返回的項目數和的getItem()方法從對象返回一個特定項目。

1

你需要一個循環,以兩個列表遍歷:

for (int index = 0; index < letters.Count; index++) 
{ 
    Console.WriteLine(letters[index]); 
    Console.WriteLine(numbers[index]); 
} 

這預示着你的列表的長度相同。如果他們不是,你必須設置較短的列表長度的上限。

for (int index = 0; index < Math.Min(letters.Count, numbers.Count); index++) 
6

也許你可以使用IEnumerable<T>.Zip(...),參見here,進行組合。

var data = letters.Zip(numbers, (l, n) => new { letter = l, number = n}) 
foreach (var item in data) { 
    Console.Writeline(item.letter); 
    Console.Writeline(item.number); 
} 
3

不要做兩個嵌套循環,它們用於枚舉兩個集合中所有可能的對。

相反,要對指數形成迴路,並使用它兼具收藏,或者使用LINQ的Zip方法:

foreach (var pair in letters.Zip(numbers, (l, n) => new {Letter=l, Number=n})) { 
    Console.WriteLine("{0} - {1}", pair.Letter, pair.Number); 
} 
2

假設你的數字和字母,從IEnumerable的派生的集合,你可以這樣做這個:

var zipped = letters.Zip(numbers, Tuple.Create); 

foreach (var tuple in zipped) 
{ 
    Console.WriteLine(tuple.Item1); 
    Console.WriteLine(tuple.Item2); 
} 
+0

是否有可能使用此方法循環兩個以上的值? –

+0

是的,這是可能的。如果你的所有集合都是相同的長度,你壓縮第一對,然後壓縮下一對的結果,但它會有點不整潔,因爲你最終會得到嵌套元組@simon.S –

0

發生什麼事情是,每當你的外部循環運行,內部運行兩次。

這是因爲你的循環是嵌套的,所以沒有得到解決。 如果絕對必須爲此使用嵌套的循環,你必須增加一個檢查是否您的號碼並未打印

喜歡的東西:

foreach(var i in letters) 
{ 
    Console.WriteLine(i); 

    foreach(var a in numbers) 
    { 
     if (a.isPrinted) //if it has been printed already 
     { 
      continue; //skip ahead 
     } 
     else 
     { 
      Console.WriteLine(a.number); 
      a.isPrinted = true; 
      break; //stop and jump out of the foreach loop 
     } 
    } 
} 

這也意味着,每個號碼實際上是一個對象,持有bool isPrintedint number
我不會這樣做,它是可笑的低效率。
你應該做別人已經建議的。