Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在字典列表上动态构建group by_C#_Linq_Dynamic_Datatable_Group By - Fatal编程技术网

C# 如何在字典列表上动态构建group by

C# 如何在字典列表上动态构建group by,c#,linq,dynamic,datatable,group-by,C#,Linq,Dynamic,Datatable,Group By,我正在尝试在IEnumerable上执行groupby。问题是,我在编译时不知道要按哪些字段分组。我在stack上找到了一个例子,它解释了当类已知且具有属性时如何执行此操作,但在我的例子中,我处理的是一个字典,键也只有在运行时才知道 我的代码类似于这样(我知道这不会编译…): 私有对象GetValuesGroupedBy(列出groupbyNames,列出summableNames) { //获取网格中的项目列表 var listOfDicos=grid.AllItems; 返回目录 .Grou

我正在尝试在IEnumerable上执行groupby。问题是,我在编译时不知道要按哪些字段分组。我在stack上找到了一个例子,它解释了当类已知且具有属性时如何执行此操作,但在我的例子中,我处理的是一个字典,键也只有在运行时才知道

我的代码类似于这样(我知道这不会编译…):

私有对象GetValuesGroupedBy(列出groupbyNames,列出summableNames)
{
//获取网格中的项目列表
var listOfDicos=grid.AllItems;
返回目录
.GroupBy(x=>new{x[groupbyNames[0]],
x[groupbyNames[1]],
x[groupbyNames[2]]})
.Select(group=>new{group.Key,
group.Sum(x=>x[summableNames[0]]),
Sum(x=>x[summableNames[1]]);
}  
有什么想法吗?我已经开始研究动态LINQ,但我被卡住了(因为我使用的不是属性,而是键/值集合)

谢谢大家


肖恩

所以我可以让groupby工作。。。(select语句是另一个问题)。感谢c0d1ng让我走上了正确的道路。语法不是那么简单,因为我使用的是索引器而不是属性

下面是我的代码:

    private void GetValuesGroupedBy(List<Dictionary<string, object>> list, List<string> groupbyNames, List<string> summableNames)
    {
        // build the groupby string
        StringBuilder groupBySB = new StringBuilder();
        groupBySB.Append("new ( ");
        bool useComma = false;
        foreach (var name in groupbyNames)
        {
            if (useComma)
                groupBySB.Append(", ");
            else
                useComma = true;

            groupBySB.Append("it[\"");
            groupBySB.Append(name);
            groupBySB.Append("\"]");
            groupBySB.Append(" as ");
            groupBySB.Append(name);
        }
        groupBySB.Append(" )");

        var groupby = list.GroupBy(groupBySB.ToString(), "it");
    }
private void GetValuesGroupedBy(列表、列表groupbyNames、列表summableNames)
{
//构建groupby字符串
StringBuilder groupBySB=新建StringBuilder();
groupBySB.Append(“新(”);
bool-usecoma=false;
foreach(groupbyNames中的变量名)
{
如果(使用逗号)
groupBySB.追加(“,”);
其他的
usecoma=true;
Append(“it[\”);
groupBySB.Append(名称);
groupBySB.Append(“\”]);
groupBySB.追加(“as”);
groupBySB.Append(名称);
}
groupBySB.追加(“)”;
var groupby=list.groupby(groupBySB.ToString(),“it”);
}
    private void GetValuesGroupedBy(List<Dictionary<string, object>> list, List<string> groupbyNames, List<string> summableNames)
    {
        // build the groupby string
        StringBuilder groupBySB = new StringBuilder();
        groupBySB.Append("new ( ");
        bool useComma = false;
        foreach (var name in groupbyNames)
        {
            if (useComma)
                groupBySB.Append(", ");
            else
                useComma = true;

            groupBySB.Append("it[\"");
            groupBySB.Append(name);
            groupBySB.Append("\"]");
            groupBySB.Append(" as ");
            groupBySB.Append(name);
        }
        groupBySB.Append(" )");

        var groupby = list.GroupBy(groupBySB.ToString(), "it");
    }