LINQ Lambda分组为嵌套列表

时间:2018-03-08 13:02:02

标签: .net linq lambda

我有列表中的数据

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;}

2 个答案:

答案 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);
    }
}

请参阅?因为我没有对其他类进行所有预测,所以阅读/测试/维护更简单