在DataTable中分组by

本文关键字:by DataTable | 更新日期: 2023-09-27 18:02:06

我有一个数据表

DataTable table = new DataTable();
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Value", typeof(string));          
table.Rows.Add("A", "High");
table.Rows.Add("B", "Low");
table.Rows.Add("A", "Low");
table.Rows.Add("C", "High");
table.Rows.Add("B", "Medium");
table.Rows.Add("A", "High");
table.Rows.Add("A", "High");

我想使用LINQ对我的结果进行分组,如:

Name   value  Count
-------------------
A      High    3
A      Low     1
B      Medium  1
B      Low     1
C      High    1

在DataTable中分组by

这是一种方法:

IEnumerable<IGrouping<Tuple<string,string>, DataRow>> groups= table.Rows.OfType<DataRow>().GroupBy(x=> new Tuple<string,string>(x["Name"].ToString(), x["Value"].ToString()));
foreach (var group in groups)
{
    //Name Value: Count
    Console.WriteLine(group.Key.Item1 + " " + group.Key.Item2 + ": " + group.Count());
}

这个Linq to DataSet查询将返回分组值作为匿名对象

var query = from r in table.AsEnumerable()
            group r by new { 
               Name = r.Field<string>("Name"),
               Value = r.Field<string>("Value")
            } into g
            select new {
                g.Key.Name,
                g.Key.Value,
                Count = g.Count()
            };

用法:

foreach(var item in query)
{
    // item.Name
    // item.Value
    // item.Count
}

如果你想要结果作为另一个数据表,那么你可以使用CopyToDataTable扩展,如MSDN文章如何:实现CopyToDataTable在泛型T不是DataRow:

DataTable result = query.CopyToDataTable();