Foreach 循环不像我想象的那样[关闭]
Posted
技术标签:
【中文标题】Foreach 循环不像我想象的那样[关闭]【英文标题】:Foreach loop not acting like I thought it would [closed] 【发布时间】:2021-05-10 05:38:25 【问题描述】:我一直在研究这个问题,我有两个平行的长度相同的数组。我已经嵌套了 foreach 循环来比较数组,所以我可以知道哪个数字更大。一个数字是随机生成的,另一个是从用户输入中收集的。我遇到的问题是在移动到下一个随机生成的数字之前,将随机生成的数字与每个用户输入进行比较。这是我的代码:
Random r = new Random();
int length = 10;
int[] ranNum = new int[length];
int[] userNum = new int[length];
for (int i = 0; i < length; i++)
ranNum[i] = r.Next(1, 100);
for (int i = 0; i < length; i++)
Console.WriteLine("Enter a number between 1 and 100");
userNum[i] = Convert.ToInt32(Console.ReadLine());
foreach(int rn in ranNum)
foreach(int ui in userNum)
if (rn < ui)
Console.WriteLine(rn + " is less than " + ui);
else if (rn > ui)
Console.WriteLine(rn + " is greater than " + ui);
else
Console.WriteLine(rn + " is equal to " + ui);
我确定我遗漏了一些明显的东西,任何帮助将不胜感激提前谢谢你
【问题讨论】:
为什么要编辑花括号以匹配 Java/javascript 样式?换行符上的花括号在 C# 中是标准的。 您希望它如何工作。假设您有两个数组:[1, 5, 200]
和 [2, 4, 100]
。您想对数组及其元素做什么?
@BradfordDillon:“换行符上的花括号是 C# 中的标准。” 请注意,C 系列语言中的花括号样式是一个宗教问题。在过去的几十年里,已经在这个问题上发生了严重的争吵(通常升级为激烈的战争或午餐室的排斥)。甚至还有专门的 Wiki 页面:en.wikipedia.org/wiki/Indentation_style。请注意,没有 C# 标题。
只需使用单个索引 for 循环并使用相同的索引访问值。 foreach
不适合这种逻辑。
见Iterate two Lists or Arrays with one ForEach statement in C#
【参考方案1】:
嵌套的foreach
循环与嵌套的for
循环完全相同,因为它们循环遍历每个外部值和所有内部值。如果您只是想一对一地比较这些值,则需要同时遍历两个数组。您可以通过获取他们的迭代器并使用while
循环来做到这一点;您可以使用 LINQ 和 Zip
两个数组;或者,您可以使用另一个 for
循环,就像您用来生成数组一样,并使用公共索引来遍历两个循环:
for (int i = 0; i < length; i++)
var rn = ranNum[i];
var ui = userNum[i];
if (rn < ui)
Console.WriteLine(rn + " is less than " + ui);
else if (rn > ui)
Console.WriteLine(rn + " is greater than " + ui);
else
Console.WriteLine(rn + " is equal to " + ui);
根据您对这些值的处理方式,您可能会考虑合并这些循环,但这是您同时遍历这两个循环的方式。
【讨论】:
你也可以使用.Zip()
我在回答中提到了这一点【参考方案2】:
这里有 两个 嵌套的 foreach
循环,它们将创建所有可能的值组合。如果您只想按索引匹配,可以使用单个 for
循环,也可以使用 IEnumerable.Zip()
函数:
var results = ranNum.Zip(userNum, (rn, ui) =>
if (rn < ui) return $"rn is less than ui";
if (rn > ui) return $"rn is greater than ui";
return $"rn is equal to ui";
);
foreach (var result in results)
Console.WriteLine(result);
【讨论】:
以上是关于Foreach 循环不像我想象的那样[关闭]的主要内容,如果未能解决你的问题,请参考以下文章