Dan Hall
Dan Hall

Reputation: 1534

Combine duplicates in a list

In my current test project I'm looking to combine all objects in a list where one of their values is the same as in another object, I would then like to check the other values under these objects and combine them together, here's and example:

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
}

From the above Object1 and and Object3 would be combined based on their related 'id' value, their prices would then be combined and would result in the following object replacing Object1 and Object3 in a list:

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

The end list would then look like this:

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

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

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

So far I would go about obtaining the value using linq as follows:

  1. Select all with the same id add thier values
  2. Create new object with combined values for all obtained in step 1 and add to new list
  3. Continue over list and if the 'id 'already exists in new list then ignore it as it's already been combined into the new list

Is there maybe a quicker easier way with a single LINQ statement?

Upvotes: 2

Views: 2353

Answers (2)

garret
garret

Reputation: 1134

try group by

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

whole console app:

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

Upvotes: 0

Leonid Malyshev
Leonid Malyshev

Reputation: 475

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

Upvotes: 5

Related Questions