c# - 带有字典键的动态 Linq
问题描述
我目前有一段代码,它需要 a 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)));
但是,我不清楚:
- 然后我如何将这个类传递给 a
Select
并GroupBy
调用?System.Linq.Dynamic 公开了一个接受字符串的 Select() 重载——我是否只传递类的属性名称?System.Linq.Dynamic 如何知道使用动态生成的类型? - 我如何用值填充它?我知道我可以使用 Activator 手动执行此操作,但是是否有将其映射到原始对象的值的内置方法,或者我是否需要自定义滚动它?
- 我什至在正确的轨道上吗?这些示例似乎没有使用 DynamicExpression 等,而只是使用字符串。
解决方案
此答案适用于您是否想使用外部库。这将比使用库效率低一点。您似乎还可以尝试另一个名为 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();
推荐阅读
- android - 使用 Visual Studio Code 作为移动开发 IDE,通过安装 Android 命令工具
- android - 在 Kotlin 中更改 TextView 的文本时出错 - Android
- java - 如何在 twitter4j 中将 twitter ID 转换为用户名?或者我可以使用 id 来获取用户简介吗?
- javascript - 使用 Server-Sent Event 获取在线用户
- c# - 如何创建新列表
基于另外两个列表 并考虑重复? - spring - 如何配置 Spring 的 Rabbit 模板以在超时时抛出异常
- python - 在不让我输入的情况下跳出循环
- android - datastore.first() , .last() , .map() 等方法在 Android Studio 的所有项目中都丢失/未解决的引用错误,idk 为什么它们消失了
- themes - 激活新主题后出现 Opencart 3.0.3.8 错误
- excel - Excel:计算过去 24 小时前行的总数