在 C# 中使用 ReadLine 方法

Posted

技术标签:

【中文标题】在 C# 中使用 ReadLine 方法【英文标题】:Consume ReadLine method in C# 【发布时间】:2015-01-26 03:58:01 【问题描述】:

我有一个接受输入的程序:读取的第一行是要给出的坐标数,其余行是坐标本身。它读取所有坐标并找到任意两点之间的最短距离(两个最近坐标之间的距离),然后显示距离和找到答案所需的时间。

我的问题是,当我运行程序时,我必须按 Enter 键才能计算“找到答案所需的时间”。我必须使用 1000 个整数的输入数据,所以我必须将数字 粘贴 到控制台中 - 然后立即按 Enter 键,以免花费太多时间。

我的问题是:使用 ReadLine 方法的最简单方法是什么,以便程序的 Stopwatch 对象不必等待按下 Enter 键。我无法解决这个问题。

这是我的程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Numerics;

namespace ConsoleApplication2

    class Program
    
        static void Main(string[] args)
        
            double smallestDistance = 0.0;
            int numberOfPoints = 0;
            String userInput = "";
            String coordinate = "";
            int coordinatesEntered = 0;

            //Grab the number of points that will be used.
            userInput = Console.ReadLine();

            //Try and convert and store the input to an integer.
            numberOfPoints = Convert.ToInt32(userInput);

            int[] xcoords = new int[numberOfPoints];
            int[] ycoords = new int[numberOfPoints];

            //Create a new stopwatch in order to time program.
            Stopwatch sw = Stopwatch.StartNew();

            //Get all the points.
            while(coordinatesEntered < numberOfPoints)
               
                coordinate = Console.ReadLine();
                string[] numbers = coordinate.Split(' ');

                xcoords[coordinatesEntered] = Convert.ToInt32(numbers[0]);
                ycoords[coordinatesEntered] = Convert.ToInt32(numbers[1]);

                coordinatesEntered++;
            //end while

            smallestDistance = getShortestDistance(xcoords, ycoords, numberOfPoints);
            sw.Stop ( );
            Console.Write ("\n");
            Console.WriteLine(string.Format("0:N6", Math.Sqrt(smallestDistance)));
            Console.WriteLine ("Time used: 0 secs", sw.Elapsed.TotalMilliseconds / 1000);
            Console.ReadKey ( );
        

        public static double getShortestDistance(int[] x, int[] y, int numOfCoords)
        
            int i;
            int j;

            double shortestDistance = 0;

            for (i = 0; i<numOfCoords-1 ; i++)
            
                for (j= i+1 ; j<numOfCoords ; j++)
                
                    double xresultsqrd = Math.Pow((x[j] - x[i]), 2.0);
                    double yresultsqrd = Math.Pow((y[j] - y[i]), 2.0);

                    double finalResult = xresultsqrd + yresultsqrd;

                    if(i == 0)
                    
                        shortestDistance = finalResult;
                    else if(finalResult < shortestDistance)
                        shortestDistance = finalResult;
                    //end elseif
                //end inner-for
            //end outer-for

            return shortestDistance;
        //end getShortestDistance;

    //end class Program
//end namespace ConsoleApplication2

这是输入所需的txt文件: http://hastebin.com/zulowuvuyu.lisp

我认为问题在于 ReadLine 方法正在等待按下 Enter,但由于我是 Pasting 没有读取 Enter 键。如何使 ReadLine 停止寻找要按下的 Enter(也就是使用该方法)?

【问题讨论】:

您是否要测量输入坐标所需的时间?还是只是计算所需的时间? 另外,如果数据已经在一个文件中(你正在从某个地方复制),为什么不直接读取文件呢? 最好的办法是从@Rufus L 提到的文件中读取您的输入 我正在尝试计算执行计算所需的时间。我实际上需要手动输入文本,因此我无法使用 StreamReader 为什么不将秒表移到 while 循环之后? 【参考方案1】:

有很多方法,但在输入列表中添加一个额外的回车就可以了。

更好的解决方案是:

从不同的来源(如文件)读取它 使用Console.In将输入作为流读取

【讨论】:

最好添加为评论而不是答案:) 为什么?我不是在回答问题吗?他要求最简单的解决方案 编辑后的答案似乎更好。代码 sn-p 也不错。 我看不出将输入作为流读取会有什么帮助。请详细说明。流不会终止最后一行,无论是使用换行符还是到达流的末尾,因此很难看出该建议将如何改进。

以上是关于在 C# 中使用 ReadLine 方法的主要内容,如果未能解决你的问题,请参考以下文章

Node.js实现终端输入(readline模块)

python 逐行读取文件的几种方法

C# StreamReader,自定义分隔符的“ReadLine”

LFS 系列从零开始 DIY Linux 系统:构建 LFS 系统 - Readline-6.3

我可以在“do”中使用“let”吗? [复制]

寒假作业1-5