如何找到一个数据表的每列的平均值使用c#
我有一个.csv文件包含名称,滚动,主题相应我解析成一个数据表,并计算每个主题的最高标记。我想要计算的是每个主题的平均值。谁能帮我这个 !!!!!如何找到一个数据表的每列的平均值使用c#
这是我的输出。
为ComputerScience最高分:
Name : Manoj
Roll Number : 1212334556
Mark : 94
生物学最高分:
Name : Sandeep
Roll Number : 1223456477
Mark : 90
工商最高分:
Name : BarathRam
Roll Number : 1212345664
Mark : 97
和CSV文件包含名称,Rollno,计算机,生物学,商业。
现在我需要得到的是每个主题
的平均我的代码:
static DataTable table;
static void Main(string[] args)
{
StreamReader r = new StreamReader(@"C:\Users\GOPINATH\Desktop\stud1.csv");
string line = r.ReadLine(); //reads first line - column header
string[] part = line.Split(','); //splits the line by comma
createDataTable(part);
//copy from CSV to DataTable<String,String,int,int,int>
while ((line = r.ReadLine()) != null)
{
try
{
part = line.Split(',');
table.Rows.Add(part[0], part[1], Convert.ToInt32(part[2]), Convert.ToInt32(part[3]), Convert.ToInt32(part[4]));
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
r.Close();
int mark1_index = 0, mark2_index = 0, mark3_index = 0; //initailize index value 0 for highest marks
//finding the index of the highest mark for each subject
for(int i=0 ; i<table.Rows.Count ; i++)
{
if (Convert.ToInt32(table.Rows[i][2]) > Convert.ToInt32(table.Rows[mark1_index][2])) //subject1
{
mark1_index = i;
}
if (Convert.ToInt32(table.Rows[i][3]) > Convert.ToInt32(table.Rows[mark2_index][3])) //subject2
{
mark2_index = i;
}
if (Convert.ToInt32(table.Rows[i][4]) > Convert.ToInt32(table.Rows[mark3_index][4])) //subject3
{
mark3_index = i;
}
}
printmark(table,mark1_index, 2);
printmark(table,mark2_index, 3);
printmark(table,mark3_index, 4);
Console.Read();
}
public static void createDataTable(string[] columnName)
{
//create DataTable<String,String,int,int,int>
table = new DataTable();
table.Columns.Add(columnName[0], typeof(String));
table.Columns.Add(columnName[1], typeof(String));
table.Columns.Add(columnName[2], typeof(int));
table.Columns.Add(columnName[3], typeof(int));
table.Columns.Add(columnName[4], typeof(int));
}
public static void printmark(DataTable t, int rowIndex, int columnIndex)
{
Console.WriteLine("Highest mark for " + t.Columns[columnIndex].ColumnName + ":");
Console.WriteLine("\tName: " + (string)t.Rows[rowIndex][0]);
Console.WriteLine("\tRole Number: " + (string)t.Rows[rowIndex][1]);
Console.WriteLine("\tMark: " + (int)t.Rows[rowIndex][columnIndex]);
}
}
}
你可以使用LINQ的和做到这一点。
DataTable t;
var average = t.AsEnumerable().Average(x=> x.Field<int>("columnname"));
var result=table.AsEnumerable()
.GroupBy(x=>x.Field<string>("Subject"))
.Select(x=>new
{
Subject=x.Key,
Average=x.Average(x=> x.Field<int>("Mark"));
}).ToList();
为了通过主题来计算平均分,首先你需要GROUPBY主题,然后计算出平均每个组。
非常感谢! @Bumb你可以向我发送你的查询以及我的代码..我发现将你的查询插入到我的代码中很困难。它显示我的错误
@cjgeez我没有检查你的代码!,我假设你能够读取文件并生成'DataTable'。一旦你的'DataTable'生成了,并且你有了Columns''Subject''和''Mark'',你就可以用我的查询来得到一个带有2个道具('Subject'和'Average')的匿名对象。 –
它是如何工作的。我是否需要重构我的程序 – cjgeez
您想要查找每列的平均值,对不对?这个查询计算给定'columnname' –
的平均值!你可以说得更详细点吗。由于我是C#的初学者,我无法找到需要插入此查询的区域。如果可能,你可以在我的代码中发送你的查询。因为我觉得很难实施。我会开始继续下一个。谢谢 !! – cjgeez