我有一个包含大量重复值的数据集,这些数据来自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的额外列,否则该组是没有意义的。如何获得带有计数的额外列?
注意:对于将此问题标记为以下问题的副本的人,请参阅上述说明。标记的问题是如何对数据集进行排序。
答案 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);
});
我知道它既不漂亮也不简洁,但它有效。