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

时间:2016-07-27 10:22:16

标签: c#

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

我们说我有一个班级:

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

有没有办法获取此List并将任何具有相同名称字段的对象组合在一起?

因此,新列表将是1个对象:

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

有明显的&#34;长&#34;这样做的方式,但它将是笨重和昂贵的(通过列表几次找到喜欢对象)。我想知道我是否错过任何干净的方式。我故意做了一个简单的例子,这样答案就是概念证明,而不是为我编写代码。我的实际问题比这更复杂,但我无法弄清楚它的这一方面。

2 个答案:

答案 0 :(得分:0)

使用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

答案 1 :(得分:0)

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

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