从数据表计算组的百分比

我有一个如下所示的数据表

在此处输入图像描述 我的结果应该是A = 40%,B = 60%..即2/5和3/5组名可以是A,B,C等……

如何根据数据表值计算数字?

您可以使用LINQ并将其转换为字典:

 DataTable dt = new DataTable("test1"); dt.Columns.AddRange(new DataColumn[] { new DataColumn("TASKID"), new DataColumn("GROUPID"), new DataColumn("GROUPNAME") }); dt.Rows.Add(new object[] { 12, 2, "A" }); dt.Rows.Add(new object[] { 13, 3, "B" }); dt.Rows.Add(new object[] { 12, 2, "A" }); dt.Rows.Add(new object[] { 14, 3, null }); dt.Rows.Add(new object[] { 15, 3, "B" }); var query = (from DataRow row in dt.Rows group row by row["GROUPNAME"] into g select g).ToDictionary(x => (x.Key.ToString() == "" ? "*" : x.Key.ToString()), x => (int)((x.Count() * 100) / dt.Rows.Count)); 

遍历字典以显示值:

 foreach(KeyValuePair kvp in query) Console.WriteLine(kvp.Key + " - " + kvp.Value.ToString()); 

输出:

 A - 40 B - 40 * - 20 

百分比被转换为int。 如果您需要更准确的值,只需更改(int)((x.Count() * 100) / dt.Rows.Count)

一个简单的方法,通过循环。 以下内容应与您需要的内容类似。

 //Simulated datatable DataTable table1 = new DataTable(); table1.Columns.Add(new DataColumn("TaskID", typeof(int))); table1.Columns.Add(new DataColumn("GroupID", typeof(int))); table1.Columns.Add(new DataColumn("GroupName", typeof(String))); //Entered test values DataRow dr1 = null; dr1 = table1.NewRow(); dr1["TaskID"] = 12; dr1["GroupID"] = 2; dr1["GroupName"] = "A"; table1.Rows.Add(dr1); dr1 = table1.NewRow(); dr1["TaskID"] = 13; dr1["GroupID"] = 3; dr1["GroupName"] = "B"; table1.Rows.Add(dr1); dr1 = table1.NewRow(); dr1["TaskID"] = 14; dr1["GroupID"] = 2; dr1["GroupName"] = "A"; table1.Rows.Add(dr1); dr1 = table1.NewRow(); dr1["TaskID"] = 15; dr1["GroupID"] = 3; dr1["GroupName"] = "B"; table1.Rows.Add(dr1); dr1 = table1.NewRow(); dr1["TaskID"] = 16; dr1["GroupID"] = 3; dr1["GroupName"] = "B"; table1.Rows.Add(dr1); //solution starts from here Dictionary totalCount = new Dictionary(); for (int i = 0; i < table1.Rows.Count; i++) { if (totalCount.Keys.Contains(table1.Rows[i]["GroupName"].ToString())) { int currVal = totalCount[table1.Rows[i]["GroupName"].ToString()]; totalCount[table1.Rows[i]["GroupName"].ToString()] = currVal + 1; } else { totalCount[table1.Rows[i]["GroupName"].ToString()] = 1; } } foreach (var item in totalCount) { MessageBox.Show(item.Value.ToString()); } 

要么

 //solution starts from here var data = table1.AsEnumerable().GroupBy(m => m.Field("GroupName")).Select(grp => new { GroupName = grp.Key, Count = (int)grp.Count() }).ToList(); 

希望这可以帮助

使用Linq

  var data=datatable.AsEnumerable().GroupBy(m => m.Field("GROUPNAME")).Select(grp => new { GROUPNAME= grp.Key, Count = (int)grp.Count() });