简体   繁体   English

C#读取文本文件查找最小最大平均值

[英]c# read text file find min max average

I am studying at TAFE but the class and myself are getting no help from my lecturer at all. 我正在TAFE学习,但是班级和我自己都没有得到老师的帮助。

I need to read from a txt file and find the min max and average from it and print it to the console. 我需要读取一个txt文件,并从中找到最小最大和平均值,然后将其打印到控制台。

The previous exercise was to get min max average from an array and I have written this and it works fine. 先前的练习是从数组中获取最小最大平均值,而我已经编写了此代码,并且效果很好。 I am using VS2012. 我正在使用VS2012。

I have written the code to read the text file and print it to the console - but i cannot find the min max and average. 我已经编写了读取文本文件并将其打印到控制台的代码-但我找不到最小最大值和平均值。 I get "Object reference not set to an instance of an object." 我得到“对象引用未设置为对象的实例”。 when i run the program. 当我运行程序时。

Note that I have used the same code to find min max average as from an array... I feel this might be the issue but I cannot work it out!! 请注意,我使用相同的代码来查找数组中的最小最大平均值...我觉得这可能是个问题,但我无法解决!

Here is my code for the array... 这是我的数组代码...

        static void Main(string[] args)
        {
            int[] hoursArray = { 1, 24, 9, 7, 6, 12, 10, 11, 23, 8, 2, 9, 8, 8, 9, 7, 9, 15, 6, 1, 7, 6, 12, 10, 11, 23, 1, 2, 9, 8 };
            for (int i = 0; i < hoursArray.Length; i++)
            {
                Console.WriteLine(hoursArray[i].ToString());
            }

            {

                {
                    int low = hoursArray[0];
                    for (int index = 1; index > hoursArray.Length; index++)
                    {
                        if (hoursArray[index] < low)
                        {
                            low = hoursArray[index];
                        }
                    }

                    Console.WriteLine("Lowest Hours Parked = " + low);

                int high = hoursArray[0];
                for (int index = 1; index < hoursArray.Length; index++)
                {
                    if (hoursArray[index] > high)
                    {
                        high = hoursArray[index];
                    }
                }

                Console.WriteLine("Highest Hours Parked = " + high);

                    int total = 0;
                    double average = 0;
                    for (int index = 0; index < hoursArray.Length; index++)
                    {
                        total = total + hoursArray[index];
                    }

                    average = (double)total / hoursArray.Length;
                    Console.WriteLine("Average Hours Parked =" + average.ToString("N"));

                    Console.ReadLine();
                }
            }
        }
    }
}

As mentioned this works fine. 如前所述,这很好。 Now for my problem... I have written the code to display the data from the text file as per below with my comments... 现在针对我的问题...我已经编写了代码,如下所示显示文本文件中的数据并添加了注释...

        static void Main(string[] args)
    {
        StreamReader hours = new StreamReader("hours.txt");
        string number = "";

        while (number != null)
        {
            number = hours.ReadLine();
            if (number != null)
                Console.WriteLine(number);
        }
        //list of numbers above is all ok when running program

        int total = 0;
        double average = 0;
        for (int index = 0; index < number.Length; index++)
        {
            total = total + number[index];
        }
        average = (double)total / number.Length;
        Console.WriteLine("Average = " + average.ToString("N2"));

        int high = number[0];

        for (int index = 0; index < number.Length; index++)
        {
            if (number[index] > high)
            {
                high = number[index];
            }
        }

        Console.WriteLine("Highest number = " + high);

        int low = number[0];

        for (int index = 0; index > number.Length; index++)
        {
            if (number[index] < low)
            {
                low = number[index];
            }
        }
        Console.WriteLine("Lowest number = " + low);
        hours.Close();
                Console.ReadLine();
        }
    }
}

I suggest using Linq : 我建议使用Linq

// First of all define the source - it can be an array, file - whatever:
// var source = hoursArray; // e.g. source for the array
var source = File
  .ReadLines(@"C:\MyFile.txt")         //TODO: put actual file here
  .SelectMany(line => line.Split(',')) //TODO: put actual separator here
  .Select(item => int.Parse(item));

// having got source (IEnumerable<int>) let's compute min, max, average

int max = 0;
int min = 0;
double sum = 0.0; // to prevent integer division: 7/2 = 3 when 7.0 / 2 = 3.5
int count = 0;
boolean firstItem = true;

foreach (item in source) {
  sum += item; 
  count += 1;

  if (firstItem) {
    firstItem = false;
    max = item;
    min = item;
  } 
  else if (item > max)
    max = item;
  else if (item < min)
    min = item;
}

// Finally, formatted output
Console.Write("Min = {0}; Max = {1}; Average = {2}", min, max, sum / count);

Use File.ReadLines to read the file contents and then convert those to int array using simple Linq statements. 使用File.ReadLines读取文件内容,然后使用简单的Linq语句将其转换为int数组。

int[] hoursArray = File
  .ReadLines("filepath")  // Read all lines,
  .SelectMany(s => s.Split(",").Select(int.Parse)) // Split by ',' and convert them to int.
  .ToArray(); 

Once you do this, rest of the code should work as it is. 完成此操作后,其余代码应按原样工作。

Also one more suggestion, there are predefined methods/functions on array to get Average , Min and Max . 还有一个建议,在数组上有预定义的方法/函数来获取AverageMinMax

You could just do. 你可以做。

var avg = hoursArray.Average();
var min = hoursArray.Min();
var max = hoursArray.Max();
string text = System.IO.File.ReadAllText("filePath");
        int[] hoursArray = (text.Split(' ').ToArray()).Select(x => Convert.ToInt32(x)).ToArray();
        int max = hoursArray.Max();
        int min = hoursArray.Min();
        double avg = hoursArray.Average();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM