C# 大于平均值的数字(steamreader)

C# 大于平均值的数字(steamreader),c#,C#,我已经能够创建一个方法,在一个特定的文本文件中查找,并设法打印该文件中的最大、最小和平均数字 我使用了以下代码字符串 var average = File.ReadAllLines(@"test.txt").Select(int.Parse).Average(); return average; 然而,我还没有找到任何方法可以在文本文件中查找并打印出大于平均值的数字。如果有人能给我一些有价值的建议,我会非常感激。 我的代码如下: using System; using System.Colle

我已经能够创建一个方法,在一个特定的文本文件中查找,并设法打印该文件中的最大、最小和平均数字

我使用了以下代码字符串

var average = File.ReadAllLines(@"test.txt").Select(int.Parse).Average();
return average;
然而,我还没有找到任何方法可以在文本文件中查找并打印出大于平均值的数字。如果有人能给我一些有价值的建议,我会非常感激。 我的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //declare textfile

            string textFile;

            //read the textfile

            StreamReader fromFile = new StreamReader(@"test.txt");

            //calculate the result

            int biggestNumber = readBiggest(fromFile);
            int smallestNumber = readSmallest(fromFile);
            double average = readAverage(fromFile);

            //ask user to save the result in a textfile of his choice
            Console.WriteLine("Files from test.txt has been gathered...");

            textFile = userInput("Enter the filename that you wish to store the result in: ");
            StreamWriter toFile = new StreamWriter(textFile);            

            //present the result

            toFile.WriteLine("The greatest number is {0}, {1} is the smallest number. The average number is {2}", biggestNumber, smallestNumber, average);
            toFile.Close();
        }


        private static double readAverage(StreamReader fromFile)
        {
            var average = File.ReadAllLines(@"test.txt").Select(int.Parse).Average();
            return average;
        }

        private static int readBiggest(StreamReader fromFile)
        {
            var max = File.ReadAllLines(@"test.txt").Select(int.Parse).Max();
            return max;
        }
        private static int readSmallest(StreamReader fromFile)
        {
            var min = File.ReadAllLines(@"test.txt").Select(int.Parse).Min();
            return min;
        }

        private static string userInput(string nameOfTextFile)
        {
            Console.WriteLine(nameOfTextFile);
            string answer = Console.ReadLine();
            return answer;
        }
    }
}

首先-不要读取文件3次。读取磁盘上的文件将是整个程序中最慢的部分,执行3次只会使情况恶化3倍。读一次:

var numbers = File.ReadLines(@"test.txt").Select(int.Parse).ToList();
注意:如果您想让该值可用于多个类方法,只需将其分配给私有字段即可

现在,请多次使用该选项

var average = numbers.Average();
var min = numbers.Min();
var max = numbers.Max();
要获得数字>平均值,只需先计算平均值,然后在
中使用它,其中

var greaterThanAverage = numbers.Where(x => x > average);
然后,您可以迭代并打印它们:

foreach (var num in greaterThanAverage) 
{
    Console.Writeline(num.ToString());
}

类似于:

var data = File.ReadAllLines(@"test.txt").Select(int.Parse).ToList();
var avg = data.Average();
var gavg = data.Where(o=>o>avg).ToList();

不要为了求出平均值、最大值和最小值而从文件中读取三次。一次读取数据,然后在内存中使用相同的列表。如果可以迭代多次,可以使用
。其中(x>=平均值)
,作为另一个过程。请注意,由于
average
的舍入错误,这可能无法正常工作。为什么所有方法都忽略
fromFile
参数?我宁愿使用
File.ReadLines(@“test.txt”)。选择(int.Parse).ToList()
,这样您只需要存储整数,不是字符串,也不需要为每个枚举解析它们。这一点很好。延迟执行有时会在你没有意识到的情况下咬你的屁股。在映射到
int.Parse
后,添加了
ToList
部分。链a
ToList()
。否则,average、min、max函数将分别读取所有行并进行解析。@Xiaoy312由于
ReadAllLines
返回数组,因此它们只读取文件一次。如果只枚举一次,
ReadLines
可能是更好的选择,因为它会降低内存压力(但对于小文件来说,这并不重要)。