如何找到一个数据表的每列的平均值使用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")); 
+0

它是如何工作的。我是否需要重构我的程序 – cjgeez

+0

您想要查找每列的平均值,对不对?这个查询计算给定'columnname' –

+0

的平均值!你可以说得更详细点吗。由于我是C#的初学者,我无法找到需要插入此查询的区域。如果可能,你可以在我的代码中发送你的查询。因为我觉得很难实施。我会开始继续下一个。谢谢 !! – cjgeez

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主题,然后计算出平均每个组。

+0

非常感谢! @Bumb你可以向我发送你的查询以及我的代码..我发现将你的查询插入到我的代码中很困难。它显示我的错误 cjgeez

+0

@cjgeez我没有检查你的代码!,我假设你能够读取文件并生成'DataTable'。一旦你的'DataTable'生成了,并且你有了Columns''Subject''和''Mark'',你就可以用我的查询来得到一个带有2个道具('Subject'和'Average')的匿名对象。 –