我目前有一段代码,它使用DataView
,选择单个列的值,将这些值分组,然后输出计数(以得到各种直方图):
string columnName;
var dataSource = grid.DataSource as System.Data.DataView;
var values = dataSource.OfType<System.Data.DataRowView>()
.Select(r => r[columnName]);
_GroupedRowCounts = values.GroupBy(r => r[columnName])
.ToDictionary(v => v.Key, v => v.Count());
```
这很好,但是事实证明,我需要按编译时不知道的任意数量的列进行分组。
我想我可以使用System.Linq.Dynamic来实现,但是我发现它的文档相当缺乏(从:哪个GitHub项目是最新的?)开始。我显然可以使用DynamicExpression.CreateClass()
来动态创建一个类,该类具有基于要分组的列的属性,例如:
List<DataColumn> columns;
Type dynamicDataClass = DynamicExpression.CreateClass(columns.Select(c => new DynamicProperty(c.ColumnName, c.DataType)));
但是,我不清楚:
Select
和GroupBy
调用? System.Linq.Dynamic公开带有字符串的Select()重载-我是否只是传递类的属性名? System.Linq.Dynamic如何知道使用动态生成的类型?答案 0 :(得分:0)
如果您想使用外部库解决此问题,则可以使用此答案。这将比使用库效率低一些。似乎还可以尝试使用另一个名为Linq.Dynamic.Core的库。似乎更健壮。
我会将linq查询的结果转换为Dictionary类型的列表。使用此帖子的最高答案:LINQ query to return a Dictionary<string, string>
然后您可以进行如下操作:
List<Dictionary<string, string>> list = new List<Dictionary<string, string>>();
list.OrderBy(x => x["columnName"]).ToList();