在列表中组合重复项

时间:2017-12-13 10:05:10

标签: c# list linq

在我目前的测试项目中,我希望将列表中的所有对象组合在一起,其中一个值与另一个对象中的值相同,然后我想检查这些对象下的其他值并将它们组合在一起,这里和示例:

Object1
{
id = 111,
price1 = 10,
price 2 = 20
}

Object2
{
id = 222,
price1 = 10,
price 2 = 20
}

Object3
{
id = 111,
price1 = 30,
price 2 = 70
}

Object4
{
id = 444,
price1 = 15,
price 2 = 25
}

从上面的Object1和Object3将根据他们的相关' id'组合。值,它们的价格将被合并,并导致以下对象替换列表中的Object1和Object3:

NewObject
{
id = 111,
price1 = 40,
price 2 = 90
}

结束列表如下所示:

NewObject
{
id = 111,
price1 = 40,
price 2 = 90
}

Object2
{
id = 222,
price1 = 10,
price 2 = 20
}

Object4
{
id = 444,
price1 = 15,
price 2 = 25
}

到目前为止,我将使用linq获取值,如下所示:

  1. 选择具有相同ID的所有内容添加其值
  2. 使用步骤1中获取的所有内容的组合值创建新对象并添加到新列表
  3. 继续浏览列表,如果新列表中已存在“ID”,则忽略它,因为它已被合并到新列表中
  4. 使用单个LINQ语句可能更简单吗?

2 个答案:

答案 0 :(得分:3)

var result = source
.GroupBy(x => x.id,
         (key, values) => new {
            id = key,
            price1 = values.Sum(x => x.price1),
            price2 = values.Sum(x => x.price2)
         });

答案 1 :(得分:0)

尝试分组

var combined = list.GroupBy(x => x.id, x => x).Select(x => new ListObj()
            {
                id = x.Key,
                price1 = x.Sum(s => s.price1),
                price2 = x.Sum(s => s.price2),
            });

整个控制台应用:

class Program
{
    static void Main(string[] args)
    {
        var list = new List<ListObj>()
        {
            new ListObj()
            {
                id = 111,
                price1 = 10,
                price2 = 20
            },
            new ListObj()
            {
                id = 222,
                price1 = 10,
                price2 = 20
            },
            new ListObj()
            {
                id = 111,
                price1 = 30,
                price2 = 70
            },
            new ListObj()
            {
                id = 444,
                price1 = 15,
                price2 = 25
            },
        };
        var combined = list
            .GroupBy(x => x.id, x => x)
            .Select(x => new ListObj()
            {
                id = x.Key,
                price1 = x.Sum(s => s.price1),
                price2 = x.Sum(s => s.price2),
            });
        Console.ReadKey();
    }
}

public class ListObj
{
    public int id { get; set; }
    public int price1 { get; set; }
    public int price2 { get; set; }
}