我进行了一次练习,需要计算.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元素
-检查列表中的元素是否可以转换为双精度数组;如果该元素可以转换为双精度型,则它将存储在双精度型数组中。
如果无法将元素转换为双精度型,则仍将其存储在双精度型数组中,但是没有任何值。
-仅计算双精度数组中具有值的元素的平均值。
我已经测试了代码,它可以正常工作。
我的问题是,我采取了一个好的方法吗?您将如何做才能使其更有效率?
我尝试在其他线程中搜索解决方案。我看到过类似的问题,但是找不到与练习完全相同的问题。