组和订单数据集

时间:2016-09-03 19:32:04

标签: c# linq dataset data-manipulation

背景

我有一个包含大量重复值的数据集,这些数据来自CSV文件。

我知道如果数据使用SQL在数据库中,我将如何分组,排序和添加计数。

SQL

SELECT pass, count(pass)
FROM table
GROUP BY pass
ORDER BY pass, count(pass) ASC

我尝试使用LINQ。

我尝试过什么?

//Sort
       dtData.DefaultView.Sort = "Pass";
       dtData = dtData.DefaultView.ToTable();

 //Group
        dtData = dtData.AsEnumerable()
       .GroupBy(r => new { Col1 = r["Pass"] })
       .Select(g => g.OrderBy(r => r["Pass"]).First())
       .CopyToDataTable();

但是我需要一个名为count的额外列,否则该组是没有意义的。如何获得带有计数的额外列?

注意:对于将此问题标记为以下问题的副本的人,请参阅上述说明。标记的问题是如何对数据集进行排序。

Sorting rows in a data table

2 个答案:

答案 0 :(得分:0)

这应该做:

dtData = dtData
    .AsEnumerable()
    .GroupBy(r => r["Pass"].ToString()) // or whatever data type it is
    .Select(g => new MyTable { Pass = g.Key, Count = g.Count() })
    .OrderBy(x => x.Pass)
    .ThenBy(x => x.Count)
    .CopyToDataTable();

,其中

class MyTable 
{
    public string Pass { get; set; } // or whatever data type it is
    public int Count { get; set; }
}

答案 1 :(得分:0)

DataTable dtTable = new DataTable();
        dtTable.Columns.Add(new DataColumn("pass", typeof(int)));


        for (int i = 0; i < 100; i++)
        {
            DataRow drRow = dtTable.NewRow();
            drRow["pass"] = (i + 1) % 10;
            dtTable.Rows.Add(drRow);
        }

        var query = (from row in dtTable.AsEnumerable()
                     group row by row.Field<int>("pass") into passes
                     orderby passes.Key, passes.Count() ascending
                     select new
                     {
                         pass = passes.Key,
                         passCount = passes.Count()
                     });

        DataTable dtTableSorted = new DataTable();
        dtTableSorted.Columns.Add(new DataColumn("pass", typeof(int)));
        dtTableSorted.Columns.Add(new DataColumn("passCount", typeof(int)));

        query.ToList().ForEach(x =>
        {
            DataRow drRow = dtTableSorted.Rows.Add(x.pass, x.passCount);
        });

我知道它既不漂亮也不简洁,但它有效。