2016-04-07 24 views
1

私は一度すべての値をそれぞれ印刷するようにしています:それぞれを取得するネストループ

このようなものです。

オブジェクトlettersは "1、2 ... 10"

が含まれています。そして、 "1,2,3,4 ... 10"

を含むオブジェクトnumbersがあることをふりをすることができますループを印刷したい場合:

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 

そして、その結果が..私が欲しいもの

ではありませんどのようにすることができます私は巣のループへそれが私がそれを望むように印刷するか? foreachののinsted forloop

+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 (int i=0;i<letters.length;i++) 
{ 
    Console.WriteLine(letters[i]); 
    Console.WriteLine(numbers[i]); 
} 
+0

私にそれを打つ。この場合、ネストされたループは必要ありません。 'letters.Count' ==' numbers.Count'の場合は – levelonehuman

+2

- それ以外の場合は 'i fubo

0

ようにそれを使用する - 第二のループは最初の内ではありませんが、あなたは両方の配列を反復処理するために、1つのループを使用する必要があります。試す:これはアイテムの数と対象から特定のアイテムを返すのgetItem()メソッドを返すサイズ()メソッドを想定

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

留意されたいです。

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

たぶん、あなたは組み合わせを作るために、here参照、IEnumerable<T>.Zip(...)を使用することができます。

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

2つのネストループを実行しないで、2つのコレクションからすべての可能なペアを列挙します。代わりに

、インデックスのループを作り、そして両方のコレクションのためにそれを使用するか、または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

このメソッドを使用して3つ以上の値をループすることはできますか? –

+0

ええ、それは可能です。すべてのコレクションの長さが同じ場合は、最初のペアを圧縮してから次のペアの結果を圧縮しますが、ネストされたタプル@ Simon.S –

0

何が起こっているかは、外部ループが実行されるたびに、内側のループが2回実行されることです。

これは、ループがネストされているためです。これを回避することはありません。 あなたは絶対にこのため、ネストされたループを使用して、あなたはあなたの数はまだ

を印刷されているかどうかチェックを追加するような何かがあるだろうしなければならない場合:

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
私はそれをやっていないでしょう、それはうんざりして非効率です。
他の人が既に提案していることを実行する必要があります。

関連する問題