2

我有一个看起来像这样的对象:

Tree {
    String Name;
    Int ID;
    List<SubObjects> SubObjects
}

SubObjects {
    int Level;
    string Name;
}

我有以下形式的信息,List<Output>即 where Outputis:

Output {
    String TreeName;
    Int TreeID;
    Int SubObjectLevel;
    String SubObjectName;
}

本质上,树以以下格式表示

Tree1 TreeID1 Level1 SubObject1

Tree1 TreeID1 Level2 SubObject2

Tree1 TreeID1 Level3 SubObject3

Tree1 TreeID1 Level1 SubObject4

我想编写一个 LINQ 查询来填充 Tree,但我被困在 GroupBy 中。这是一个非常基本的问题,但我正在学习 LINQ,任何帮助将不胜感激。

谢谢!

编辑:

到目前为止,这是我的代码

var trees =
    from o in output
    select new Tree {
        Name = o.TreeName,
        ID   = o.TreeID,
        SubObjects = //somehow group them
    }

我也试过

var trees =
    from o in output
    group o in o.TreeID into levels
    select new Tree {
        Name = //at this point o.TreeName is not available
    }
4

1 回答 1

5

所以GroupBy需要一个平面列表并根据定义的键生成一组较小的列表IGrouping- 在这种情况下,您希望键是“树”,因为这是通用元素:

var sourceOutputs = <...get outputs list...>;

var query =
     // for each <Output> thingy...
     from outputThing in sourceOutputs

在这里我会暂停一下,因为您在这里有很多选择 - 我们可以按树 ID、树名等分组 - 我将按ID和分组Name

var query =
     // for each <Output> thingy...
     from outputThing in sourceOutputs
     // group them by Tree ID + Tree name
     group outputThing by 
         new { ID = outputThing.TreeID, Name = outputThing.TreeName } 
     into byTree
     // So now we can transform these groups of <Output> into a tree
     select new Tree
     {
         ID = byTree.Key.ID,
         Name = byTree.Key.Name,
         // And now the sub objects:
         // what 'byTree' actually is => a key (ID + name), 
         // and an enumerable of <Output> objects that match that key
         SubObjects = 
           (
               from matchedThingy in byTree
               select new SubObject() 
               { 
                   Level = matchedThingy.SubObjectLevel,
                   Name = matchedThingy.SubObjectName
                }
           ).ToList()
     };
于 2013-02-28T00:39:47.830 回答