【问题标题】:Foreach doubles or triples itselfForeach 自身翻倍或翻三倍
【发布时间】:2013-06-17 13:24:45
【问题描述】:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace lotto
{
class Program
{

    static void Main(string[] args)
    {
        char k = 'l';
        while (!(k == 'k'))
        {
            Random rnd = new Random();
            int[] tablica = new int[6];
            for (int i = 0; i < 6; i++)
            {

                    tablica[i] = 0;

            }
                for (int i = 0, z; i < 6; i++)
                {
                   {
                    z = rnd.Next(1, 49);
                    while (tablica.Contains(z))
                    {
                        z = rnd.Next(1, 49);
                    }
                    tablica[i] = z;
                }
            }
            Array.Sort(tablica);
            foreach (int q in tablica)
            {
                Console.Write(q);
                Console.Write(", ");
            }
            k = Convert.ToChar(Console.Read()) ;
            Console.WriteLine("\n\n\n");
        }
    }


    }
 }

它工作正常。当我使用逐步点击(Visual Studio 中的 F10)时,它运行良好。但是当我正常运行时,然后在

k=Convert.ToChar(Console.Read());

当我提供“k”时,程序会按预期停止。 当我什么都不提供时,它会这样做

 foreach (int q in tablica)
        {
            Console.Write(q);
            Console.Write(", ");
        }
        k = Convert.ToChar(Console.Read()) ;
        Console.WriteLine("\n\n\n");

两次,当我提供除“k”以外的任何内容时,它会执行三次。什么鬼。

【问题讨论】:

标签: c# .net arrays random foreach


【解决方案1】:

Console.Read 从输入流 (doc) 中一次读取一个字符。当您按 Enter 时,您将提供 两个 字符:\r 然后是 \n,因此在暂停以供用户进一步输入之前,需要读取两个字符。

我很困惑当你使用 F10 时它是如何正常运行的,因为我这样做是为了查看循环的内容,我只是碰巧在提供“无”时使用了 Enter 并看到字符弹出.

【讨论】:

  • 要“解决”那个“问题”,所有 OP 需要的是 k = Console.ReadKey().KeyChar; :)
【解决方案2】:

您是否尝试过从 Console.Read() 捕获输入并查看它为您提供了什么?这可能与正在读入的控制字符有关,并且无法正确转换为 char。

另外,完全不考虑,我建议您重新格式化您的代码(在第二个 for 循环中有多余的“{}”)。此外,为变量赋予有意义的名称始终是一种好习惯。 i、j、k 等没有内在意义。将来重构/维护代码会更容易。

我没有仔细查看您的其余代码,但我猜有更短/更简单的方法可以完成很多工作。一个方法中有这么多 for/foreach/while 循环有代码味道。

【讨论】:

    【解决方案3】:

    通过使用Console.Read(),你实际上得到了你的输入加上"\r\n",所以当你使用ENTER时你只会得到"\r\n"(2个字符),当你输入一个字符“m”时,你的输入是“m \r\n"(3 chars),这就是为什么存在“一个”差异的原因。

    另外,为什么要使用int i = 0, z;, z 在这里没有任何意义,因为这是 C++ 用法。

    【讨论】:

    • int i = 0, z;声明 int i 和 int z,就这么简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多