首页 > 解决方案 > 具有动态 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>'的接收器

标签: c#linq

解决方案


您需要对代码进行一些更改:

  • 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);
}

推荐阅读