如何使用c#

时间:2016-07-29 04:31:22

标签: linq

我有一个包含名称,roll,subject的.csv文件。我把它解析成数据表,我计算了每个主题的最高分。我想要计算的是每个主题的平均值。任何人都可以帮助我!!!!!

这是我的输出。

ComputerScience的最高分:

    Name : Manoj
    Roll Number : 1212334556
    Mark : 94

生物学最高分:

    Name : Sandeep
    Roll Number : 1223456477
    Mark : 90

商业最高分:

    Name : BarathRam
    Roll Number : 1212345664
    Mark : 97

并且csv文件包含Names,Rollno,Computer,Biology,Commerce。

现在我需要得到的是每个主题的平均值

我的代码:

    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]);

    }
}

}

2 个答案:

答案 0 :(得分:0)

您可以使用 Linq 并执行此操作。

DataTable t;
var average = t.AsEnumerable().Average(x=> x.Field<int>("columnname"));

答案 1 :(得分:0)

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();

为了按主题计算平均分数,首先需要按主题分组,然后计算每组的平均分数。