假设我有这个简单的对象定义:
public class Item
{
public int section { get; set; }
public string item { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我在单深度数组中有一些数据。这是 JSON,它将通过 Json.NET 转换为 C# 对象:
[
{
"section": 0,
"item": "Hello!"
},
{
"section": 1,
"item": "First Steps"
},
{
"section": 1,
"item": "How to Ask for Help"
},
{
"section": 2,
"item": "Your First Program"
},
{
"section": 2,
"item": "The Code"
},
{
"section": 2,
"item": "How It Works"
},
{
"section": 3,
"item": "Where To Go From Here"
}
]
Run Code Online (Sandbox Code Playgroud)
使用 Entity Framework 或其他一些方法,我得到了上述这些对象的简单列表,包含在一个var变量中。
现在我想要做的是获得相同的列表,但是每个部分都被分组为外部数组中的一个数组。例如,我想要的 JSON 如下所示:
[
[
{
"section": 0,
"item": "Hello!"
}
],
[
{
"section": 1,
"item": "First Steps"
},
{
"section": 1,
"item": "How to Ask for Help"
}
],
[
{
"section": 2,
"item": "Your First Program"
},
{
"section": 2,
"item": "The Code"
},
{
"section": 2,
"item": "How It Works"
}
],
[
{
"section": 3,
"item": "Where To Go From Here"
}
]
]
Run Code Online (Sandbox Code Playgroud)
我最初的想法是使用该groupby语句对 LINQ 查询做一些事情,但我认为这不是我正在寻找的 -groupby似乎类似于 SQL 版本,因此它只能用于聚合操作。
到目前为止,我发现的唯一其他选择是使用 LINQ 查询来获取所有部分的列表:
var allSections = (from x in myData select x.section).Distinct();
Run Code Online (Sandbox Code Playgroud)
...然后遍历这些 ID 并手动构建数组:
List<List<Item>> mainList = new List<List<Item>>();
foreach (int thisSection in allSections.ToArray())
{
List<Item> thisSectionsItems = (from x in myData where x.section == thisSection select x).ToList();
mainList.Add(thisSectionsItems);
}
return mainList;
Run Code Online (Sandbox Code Playgroud)
这应该会产生一个适当的枚举,我可以将其输入 JSON.NET 并获得预期的结果,但这似乎效率低下。
是否有更 LINQ 风格或至少更有效的方式将项目分成组?
小智 5
你当然可以做到这一点 .GroupBy()
var grouped = items
.GroupBy(x => x.section) // group by section
.Select(x => x.ToArray()) // build the inner arrays
.ToArray(); // return collection of arrays as an array
Run Code Online (Sandbox Code Playgroud)