2

IEnumerableでgroupbyを実行しようとしています。問題は、コンパイル時にどのフィールドをグループ化するかがわからないことです。クラスが既知でプロパティがある場合にこれを行う方法を説明するスタック上の別の投稿を見つけましたが、私の場合は辞書を扱っており、キーも実行時にのみ認識されます。

私のコードは次のようになります(これはコンパイルされないことを私は知っています...):

private object GetValuesGroupedBy(List<string> groupbyNames, List<string> summableNames)
{
     // get the list of items in the grid
     var listOfDicos = grid.AllItems;

     return listOfDicos
                .GroupBy(x => new { x[groupbyNames[0]], 
                                    x[groupbyNames[1]], 
                                    x[groupbyNames[2]] })
                .Select(group => new { group.Key, 
                                       group.Sum(x => x[summableNames[0]]), 
                                       group.Sum(x => x[summableNames[1]]) });
}  

何か案は?Dynamic LINQの調査を開始しましたが、スタックしています(プロパティではなく、キー/値コレクションを使用しているため)...

みなさん、ありがとう!

ショーン

4

1 に答える 1

1

だから私は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");
    }
于 2012-05-30T09:53:48.273 に答える