How to select values within a provided index range from a List using LINQ

Viewed 73707

I am a LINQ newbie trying to use it to acheive the following:

I have a list of ints:-

List<int> intList = new List<int>(new int[]{1,2,3,3,2,1});

Now, I want to compare the sum of the first three elements [index range 0-2] with the last three [index range 3-5] using LINQ. I tried the LINQ Select and Take extension methods as well as the SelectMany method, but I cannot figure out how to say something like

(from p in intList  
where p in  Take contiguous elements of intList from index x to x+n  
select p).sum()

I looked at the Contains extension method too, but that doesn't see to get me what I want. Any suggestions? Thanks.

5 Answers

Use Skip then Take.

yourEnumerable.Skip(4).Take(3).Select( x=>x )

(from p in intList.Skip(x).Take(n) select p).sum()

Starting from .NET 6 it is possible to use range syntax for Take method.

List<int> intList = new List<int>(new int[]{1, 2, 3, 3, 2, 1});

// Starting from index 0 (including) to index 3 (excluding) will select indexes (0, 1, 2)
Console.WriteLine(intList.Take(0..3).Sum()); // {1, 2, 3} -> 6

// By default is first index 0 and can be used following shortcut.
Console.WriteLine(intList.Take(..3).Sum());  // {1, 2, 3} -> 6      


// Starting from index 3 (including) to index 6 (excluding) will select indexes (3, 4, 5)
Console.WriteLine(intList.Take(3..6).Sum()); // {3, 2, 1} -> 6  

// By default is last index lent -1 and can be used following shortcut.
Console.WriteLine(intList.Take(3..).Sum());  // {3, 4, 5} -> 6

// Reverse index syntax can be used. Take last 3 items.
Console.WriteLine(intList.Take(^3..).Sum()); // {3, 2, 1} -> 6

// No exception will be raised in case of range is exceeded.
Console.WriteLine(intList.Take(^100..1000).Sum()); 

So simply put, intList.Take(..3).Sum() and intList.Take(3..).Sum() can be used with .NET 6.

Related