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 循环不像我想象的那样[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Clickhouse:runningAccumulate() 不像我预期的那样工作

sleep() 不像我预期的那样工作

React - 回调的关闭问题

Android布局权重不像我想的那样工作

JavaScript 条件不像我期望的那样短路

异步函数的行为不像我对 Jest 的预期那样