2016-04-07 81 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
我不会这样做,它是可笑的低效率。
你应该做别人已经建议的。