给定多个相同对象的列表,根据字段值对它们进行分组和组合

本文关键字:组合 字段 对象 列表 | 更新日期: 2023-09-27 17:58:45

很抱歉标题不连贯。我不知道如何简洁地解释我的问题,这就是为什么我真的不知道如何查找它。我将用一个例子来解释。。。

假设我有一门课:

public class cas
{
    public string name { get; set; }
    public int num { get; set; }
}

使用这个类,我制作了几个对象,并将它们粘贴到一个列表中。为了举例,我将制作4:

var list = new List<cas>
{
    new cas { name = "firstname", num = 1 },
    new cas { name = "firstname", num = 2 },
    new cas { name = "lastname", num = 3 },
    new cas { name = "lastname", num = 4 }
};

有没有一种方法可以使用这个列表并将具有相同名称字段的任何对象组合起来?

因此,新列表将是1个对象,其中包含:

 name = "firstname", num = 3,
 name = "lastname", num = 7

要做到这一点,显然有一条"漫长"的路,但它既笨重又昂贵(在列表中翻几遍才能找到类似的对象)。我想知道我是否错过了任何干净的方法。我故意做了一个简单的例子,这样答案就可以作为概念的证明,而不是为我写代码。我的实际问题比这更复杂,但我无法理解它的这一方面。

给定多个相同对象的列表,根据字段值对它们进行分组和组合

使用Linq,您可以获得GroupBy方法和Select方法:

list = list.GroupBy(x=> x.name)
           .Select(x=> new cas() { name = x.Key, num  = x.Sum(y=> y.num) }).ToList();

或者使用优雅的查询语法:

list = (from item in list
        group item by item.name into grouping
        select new cas()
        {
            name = grouping.Key,
            num = grouping.Sum(x => x.num)
        }).ToList();

请注意,要使用这些方法,必须在源文件的顶部添加using System.Linq

您可以使用linq,您必须将它们分组在name属性上,然后在每组的num属性上求和,如:

var result = list.GroupBy(x=>x.name)
                 .Select(g=> new cas
                             {
                                name = g.Key,
                                num = g.Sum(x=>x.num)
                             });