tags:

views:

1295

answers:

2
+4  Q: 

linq aggregate

class Category
{        
    public string Name { get; set; }
    public int Count { get; set;}
}


Name Count
AA   2
BB   3
AA   4

I have an IEnumerable<Category>

and would like to get a list of Categories with unique names and the sum of multiple entries

Output

Name Count
AA   6
BB   3

Update

class Category 
{ 
public string Name { get; set; } 
public int CountA { get; set;} 
public int CountB { get; set;} 
public string Phone { get; set;} 
}

How would I sum two columns. and the phone column can be the last row or any row

+1  A: 
var foo = new List<Category>() { 
       new Category() { Name = "AA", Count = 2},
       new Category() { Name = "BB", Count = 3},
       new Category() { Name = "AA", Count = 4}
      };

      var bar = foo.GroupBy(c => c.Name).Select(g => new Category(){ Name = g.Key, Count = g.Sum(c => c.Count) });
Brehtt
class Category { public string Name { get; set; } public int CountA { get; set;} public int CountB { get; set;} public string Phone { get; set;} }How would I sum two columns. and the phone column can be the last row or any row
+3  A: 

Your updated question isn't entirely clear in terms of the phone number, but I suspect you want something like:

    var query = from category in list
                group category by category.Name into grouped
                select new { Name = grouped.Key,
                             SumA = grouped.Sum(x => x.CountA),
                             SumB = grouped.Sum(x => x.CountB),
                             Phone = grouped.Last().Phone };

Changing grouped.Last() to grouped.First() would be more efficient, by the way.

Evaluating multiple aggregates in this way isn't terribly efficient in general. The Push LINQ project developed by myself and Marc Gravell makes it a lot more efficient at the cost of not being quite as easy to use. You might want to look into it if you need to deal with a lot of data.

Jon Skeet