83

I reckon this will be quite trivial but I can't work out how to do it. I have a List<int> and I want to sum a range of the numbers.

Say my list is:

var list = new List<int>()
{
    1, 2, 3, 4
};

How would I get the sum of the first 3 objects? The result being 6. I tried using Enumerable.Range but couldn't get it to work, not sure if that's the best way of going about it.

Without doing:

int sum = list[0] + list[1] + list[2];
James Hill
  • 60,353
  • 20
  • 145
  • 161
Bali C
  • 30,582
  • 35
  • 123
  • 152
  • Please also see that if you include System.Linq you can use many other facilities with your collection : http://msdn.microsoft.com/en-us/library/system.linq.enumerable.aspx –  May 01 '12 at 09:19

2 Answers2

137

You can accomplish this by using Take & Sum:

var list = new List<int>()
{
    1, 2, 3, 4
};

// 1 + 2 + 3
int sum = list.Take(3).Sum(); // Result: 6

If you want to sum a range beginning elsewhere, you can use Skip:

var list = new List<int>()
{
    1, 2, 3, 4
};

// 3 + 4
int sum = list.Skip(2).Take(2).Sum(); // Result: 7

Or, reorder your list using OrderBy or OrderByDescending and then sum:

var list = new List<int>()
{
    1, 2, 3, 4
};

// 3 + 4
int sum = list.OrderByDescending(x => x).Take(2).Sum(); // Result: 7

As you can see, there are a number of ways to accomplish this task (or related tasks). See Take, Sum, Skip, OrderBy & OrderByDescending documentation for further information.

James Hill
  • 60,353
  • 20
  • 145
  • 161
9

Or just use Linq

int result = list.Sum();

To sum first three elements:

int result = list.GetRange(0,3).Sum();
David Young
  • 171
  • 1
  • 2