c# - 具有动态 groupBy 的动态对象列表
问题描述
我需要实现这样的目标,但我不知道如何使它工作:
class Program
{
static List<dynamic> myList = new List<dynamic>();
static void Main(string[] args)
{
myList.Add(new { Test = "test", Test2 = "test2" });
myList.Add(new { Test = "test", Test2 = "test2" });
myList.Add(new { Test = "test1", Test2 = "test2" });
// I need to pass a dynamic list of expression like:
GenerateGroup<dynamic>(x=>x.Test, x => x.Test2); //groups myList in 2 groups
GenerateGroup<dynamic>(x=>x.Test2); //groups myList in a single group
}
private static void GenerateGroup<T>(params Expression<Func<T, object>>[] properties)
{
//I need to group for the properties passed as parameters
var result= myList.GroupBy(properties);
}
}
我收到编译器错误:
表达式树可能不包含动态操作
这只是一个复杂应用程序的示例,但最后,我需要使用动态列表,并且需要使用动态属性列表对它们进行分组。这是因为我从多个 PDF 源读取数据/属性,并且无法使用静态类。
是否可以修复此错误,或者它是编译器限制,我需要以另一种方式解决问题?
更新
由于您的回答,我想我已经向前迈出了一步:
class Program
{
static List<dynamic> myList = new List<dynamic>();
static List<Foo> myListFoo = new List<Foo>();
static void Main(string[] args)
{
myList.Add(new { Test = "test", Test2 = "test2" });
myList.Add(new { Test = "test", Test2 = "test2" });
myList.Add(new { Test = "test1", Test2 = "test2" });
myListFoo.Add(new Foo { MyProperty =1});
GenerateGroup<dynamic>(x =>new { x.Test, x.Test2});
GenerateGroup<Foo>(x=>x.MyProperty);
}
private static void GenerateGroup<T>(Func<T, object> properties)
{
var result= myList.GroupBy(properties);
result = myListFoo.GroupBy(properties);
}
}
public class Foo
{
public int MyProperty { get; set; }
}
我在 groupBy 上只有一个编译错误:
'
List<dynamic>
' 不包含 'GroupBy' 的定义,并且最佳扩展方法重载 'ParallelEnumerable.GroupBy<T, object>
(ParallelQuery<T>, Func<T, object>
)' 需要类型为 'ParallelQuery<T>
'的接收器
解决方案
您需要对代码进行一些更改:
Expression<Func<,>>
不是你要找的,所有使用都Where
接受的重载IEnumerable<T>
Func<,>
GenerateGroup
如果您要进行硬编码,则没有理由进行通用dynamic
- 您应该创建一个包含要分组的数据的对象,而不是传递多个参数
如果你混合所有这些点,你应该得到这样的结果:
static void Main(string[] args)
{
myList.Add(new { Test = "test", Test2 = "test2" });
myList.Add(new { Test = "test", Test2 = "test2" });
myList.Add(new { Test = "test1", Test2 = "test2" });
// I need to pass a dynamic list of expression like:
GenerateGroup(x => new { x.Test, x.Test2 } ); //groups myList by Test and Test2
GenerateGroup(x => x.Test2); //groups myList in a single group
}
private static void GenerateGroup(Func<dynamic, object> groupper)
{
var groupped = myList.GroupBy(groupper);
}
推荐阅读
- excel - 插入图像的问题
- testing - 为模块 yii2 创建测试
- python - 不能使用 def destroy viewset.viewset(软删除)
- javascript - 检索firebase中所有用户的所有数据
- php - 从 AppServiceProvider 访问 Session
- matlab - 在 MATLAB 中编写对数似然函数
- r - 添加日期到明年 1 月的行
- javascript - Vue组件里面使用jQuery
- python - python for android # 命令失败:/usr/bin/python -m pythonforandroid.toolchain
- python - pyautogui.locateCenterOnScreen 不断返回 NoneType 对象