c# - 使用 c# 将平面对象转换为层次结构
问题描述
我见过类似的问题,但没有回答我的情况。所以...
给定类型:
public class Flat
{
public string Group1 { get; set; }
public string Group2 { get; set; }
public int Value { get; set; }
}
public class Group1
{
public Name { get; set; }
public Group2[] Group2 { get; set; }
}
public class Group2
{
public Name { get; set; }
public int[] Values;
}
我想将 Flat 数组转换为上面指定的Group1
/Group2
层次结构。数组如下:
var flats = new []
{
new Flat { Group1 = "G1", Group2 = "G1.1", Value = 12 },
new Flat { Group1 = "G1", Group2 = "G1.1", Value = 22 },
new Flat { Group1 = "G1", Group2 = "G1.2", Value = 13 },
new Flat { Group1 = "G2", Group2 = "G1.1", Value = 14 },
new Flat { Group1 = "G2", Group2 = "G2.2", Value = 15 },
};
所以输出将等同于:
var result = new []
{
new Group1
{
Name = "G1"
Group2 = []
{
new Group2
{
Name = "G1.1"
Values = [] { 12, 22 }
},
new Group2
{
Name = "G1.2"
Values = [] { 13 }
},
}
},
new Group1
{
Name = "G2"
Group2 = []
{
new Group2
{
Name = "G2.1"
Values = [] { 14 }
},
new Group2
{
Name = "G2.2"
Values = [] { 15 }
},
}
}
}
我尝试过使用但失败了GroupBy
:
var result = flats
.GroupBy(f => f.Group1)
.Select(f => f.GroupBy(x => x.Group2).Select(y => y.Select(x => x.Value)));
我一直在摆弄这个,linqpad
但没有找到解决方案。我最初一直在尝试匿名类型,但添加了组类型。
这可能linq
吗?
解决方案
您只需要使用 LINQ 在两个级别上构建分组:
var ans = flats.GroupBy(f => f.Group1)
.Select(fg => new Group1 {
Name = fg.Key,
Group2 = fg.GroupBy(f => f.Group2).Select(fg2 => new Group2 {
Name = fg2.Key,
Values = fg2.Select(f => f.Value).ToArray()
})
.ToArray()
})
.ToArray();
注意:通常,除非您对类型有特定需求(通常与其他代码的互操作性) ,否则最好选择ToList
而不是。ToArray
Array
推荐阅读
- html - 如何删除 HTML 表格中整个列中的某些字符串?
- java - Java语言中如何连续输入int、double和String?
- typescript - 类型提示来自本地依赖的 Vue 3 全局属性
- windows - 从 powershell 中的计划任务获取更多信息
- arraylist - Groovy - ArrayList 中按键的平均值
- expo - 在 react native WEB 上,如果已安装则打开应用程序,如果未安装,请导航到商店页面
- materialize - Materialize css 不再更新了吗?
- python - 抓取 Coinmarketcap 数据只返回前 10 个结果,为什么其余 90 个不返回?
- visual-studio-code - 在 setting.json [vscode] 中设置 linter 的路径
- javascript - 这两个 JavaScript 表达式有什么区别?