我有列表中的数据
ID | val1 | val2 | val3
1 | a | b | c
1 | c | d | e
2 | a | b | c
2 | d | z | g
3 | a | b | c
我想用嵌套列表转换成列表,如:
ID 1 (2 elements in nested list)
ID 2 (2 elements in nested list)
ID 3 (1 element in nested list)
使用lanbda我想将示例1中的数据放入:
List<object>;
class object {
int ID;
Class List<details> }
Class details{
int val1;
int val2;
int val3;}
答案 0 :(得分:1)
这是它的一般要点。
var list = new List<Data>()
{
new Data(){ ID = 1, Val1 = "a", Val2 = "b", Val3 = "c" },
new Data(){ ID = 1, Val1 = "c", Val2 = "d", Val3 = "e" },
new Data(){ ID = 2, Val1 = "a", Val2 = "b", Val3 = "c" },
new Data(){ ID = 2, Val1 = "d", Val2 = "z", Val3 = "g" },
new Data(){ ID = 3, Val1 = "a", Val2 = "b", Val3 = "c" },
};
list.GroupBy(l => l.ID).ToList()
.ForEach(g => Console.WriteLine($"ID {g.Key} ({g.ToList().Count} elements in nested list)"));
答案 1 :(得分:0)
因此,您有一个输入的对象序列,并且您希望将它们分组为具有相同ID
的对象组。每个组都有一个Detail
个对象列表,其中包含具有此ID的输入序列的Val1 / Val2 / Val3
幸运的是,我没有做功能,它已经存在。它被称为Enumerable.GroupBy
var groups = myInputList.GroupBy(
inputElement => inputElement.Id,
groupElement => new Detail()
{
val1 = groupElement.val1,
val2 = groupElement.val2,
val3 = groupElement.val3,
});
它做什么,它从输入列表中获取所有元素。从此输入列表中的每个元素获取Id。这由第一个参数定义:
inputElement => inputElement.Id,
具有相同属性ID值的所有inputElements都放在同一个组中。第二个参数说明你应该对每组中的元素做什么:
groupElement => new Detail()
{
val1 = groupElement.val1,
val2 = groupElement.val2,
val3 = groupElement.val3,
}
它在这里说:如果你有一个元素应该放在这个组中,创建一个新的Detail对象,并按照描述为属性赋予值
结果是一系列实现IGrouping的对象。这意味着每个组都有一个属性Key,它具有您的值ID,它是一系列Detail对象,来自具有此ID的原始元素(请注意,我写的组是一个序列,而不是:是一个序列
如果您真的想要它所描述的格式,那么您必须在它之后进行选择:
.Select(group => new object () // why use this horrible name for your type?
{
Id = group.Key,
Details = group.ToList(),
})
.ToList();
通常,您将在查询后立即使用结果。在这种情况下,最好不要转换原始项目,只进行GroupBy
var groupsWithSameId = myInputList.GroupBy(inputElement => inputElement.Id);
foreach(var group in groupsWithSameId)
{
Console.WriteLine($"Group {group.Key}");
foreach (var element in group)
{
Console.WriteLine(element.Val1);
Console.WriteLine(element.Val2);
Console.WriteLine(element.Val2);
}
}
请参阅?因为我没有对其他类进行所有预测,所以阅读/测试/维护更简单