【问题标题】:LINQ Lambda grouping into nested listsLINQ Lambda 分组为嵌套列表
【发布时间】:2018-03-08 13:02:02
【问题描述】:

您好,我在列表中有数据

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

【问题讨论】:

  • 太棒了!你的实施有问题吗?请在您的代码中添加minimal reproducible example 并说明问题所在
  • 是的......不知道如何实现这一点。我的代码要复杂得多,所以我将其提炼为裸露的问题。我正在尝试将数据库中的数据放入对象中: List ;类对象 {int ID;班级列表
    }

标签: .net linq lambda


【解决方案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)"));

【讨论】:

    【解决方案2】:

    因此,您有一个输入对象序列,并且您希望将它们分组为具有相同 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 具有相同值的所有 inputElement 都放在同一个组中。第二个参数说明您应该如何处理每个组中的元素:

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

    看到了吗?因为我没有对其他类进行所有预测,所以阅读/测试/维护要简单得多

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2017-04-02
      • 1970-01-01
      • 2020-07-07
      相关资源
      最近更新 更多