我试图打印一次打印每个值:
像这样。
让我假装对象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
结果不是我想要的......
如何嵌套循环以使其按照我想要的方式打印?
答案 0 :(得分: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);
}
答案 1 :(得分:3)
使用forloop insted of foreach像这样使用它
for (int i=0;i<letters.length;i++)
{
Console.WriteLine(letters[i]);
Console.WriteLine(numbers[i]);
}
答案 2 :(得分: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);
}
答案 3 :(得分: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++)
答案 4 :(得分:0)
你关闭 - 第二个循环不应该在第一个循环中,但是你应该使用一个循环迭代两个数组。尝试:
for (int i = 0; i < letters.size(); i++) {
Console.WriteLine(letters.getItem(i));
Console.WriteLine(numbers.getItem(i));
}
请注意,这假定使用size()方法返回项目数,使用getItem()方法返回对象中的特定项目。
答案 5 :(得分: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 isPrinted
和int number
的对象
我不会这样做,这是非常低效的
你应该做别人已经建议的事情。