分组和排序数据集
Group and Order Dataset
背景
我有一个包含大量重复值的数据集,这些值来自 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();
但是我需要一个额外的列,称为计数,否则该组毫无意义。我如何获得带有计数的额外列?
注意:对于将此问题标记为与以下问题重复的人,请参阅上面的备注。标记的问题只是如何对数据集进行排序。
Sorting rows in a data table
应该这样做:
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; }
}
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);
});
我知道它既不漂亮也不简洁,但它确实有效。
背景
我有一个包含大量重复值的数据集,这些值来自 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();
但是我需要一个额外的列,称为计数,否则该组毫无意义。我如何获得带有计数的额外列?
注意:对于将此问题标记为与以下问题重复的人,请参阅上面的备注。标记的问题只是如何对数据集进行排序。
Sorting rows in a data table
应该这样做:
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; }
}
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);
});
我知道它既不漂亮也不简洁,但它确实有效。