从.txt文件高效解决方案计算平均值

时间:2019-05-05 11:37:09

标签: c# arrays console

我进行了一次练习,需要计算.txt文件每行的平均值。 (见下文)

Toa Narumi gradeA 10 8 7 4 6,5
Jean-François Le Clerk gradeB 5 4 7
Joe GradeC 10 10

我只想要名字和等级后面的数字。 这是我的代码:

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

namespace RenoD_Oef_Strings
{
    class Program
    {
        static void Main(string[] args)
        {
            // Variablen
            StreamReader bestand = new StreamReader(@"F:\RenoD_Oef_Strings\Punten.txt");
            string strRow; // String used to read every row of .txt file
            double?[] dblPoints; // Double array used to store all values
            List<string> strInput = new List<string>(); // String List used to store all data from .txt


            // Code
            while ((strRow = bestand.ReadLine()) != null) // Read row per row in .txt
            {
                strInput = strRow.Split(' ').ToList(); // Puts every word in the row in to the list

                int intX = 0;
                foreach(string strX in strInput)    // Calculate how many strings are in the list
                {
                    intX++;
                }

                dblPoints = new double?[intX];  // Calculate the max number of elements the double array can have

                intX = 0;
                foreach(var x in strInput)  // Checks if elements in the list can be converted in to a double 
                {
                    try
                    {
                        double dblR = Convert.ToDouble(x);  // If element can be converted in to a double, it will be stored in the double array

                        dblPoints[intX] = dblR;
                        intX++;
                    }
                    catch
                    {
                        intX++; // If element CAN NOT be converted in to a double, it will be still be stored in the double array but without any value
                    }
                }

                double dblAverage = 0;   // Double used to save the total average of one row
                intX = 0;
                foreach(var k in dblPoints)
                {
                    if (k.HasValue) // Elements without value will be ignored
                    {
                        dblAverage += Convert.ToDouble(k); // All double values will be added up
                        intX++; // Used to see how much double values there are to calculate average
                    }
                }

                dblAverage = Math.Round(dblAverage/intX, 2);  // Calculate average + round up to two decimals

                Console.WriteLine(dblAverage.ToString());
            }

            bestand.Close();

            Console.ReadKey(); 
        }
    }
}

我所做的是

-读取每行.txt文件

-将该行的所有元素放入列表中

-计算double数组将需要存储多少个元素(列表具有相同数量的元素),我稍后将其用于存储列表的所有double元素

-检查列表中的元素是否可以转换为双精度数组;如果该元素可以转换为双精度型,则它将存储在双精度型数组中。

如果无法将元素转换为双精度型,则仍将其存储在双精度型数组中,但是没有任何值。

-仅计算双精度数组中具有值的元素的平均值。

我已经测试了代码,它可以正常工作。

我的问题是,我采取了一个好的方法吗?您将如何做才能使其更有效率?

我尝试在其他线程中搜索解决方案。我看到过类似的问题,但是找不到与练习完全相同的问题。

0 个答案:

没有答案