For fun, here's a generic solution that will work for any array of any type and any w: * See edit below for improved code
private T[] GetEveryNthElement<T>(T[] array, int n)
{
return array.Select((elem, i) => new
{
IsNthElement = (i + 1) % n == 0,
Element = elem
})
.Where(o => o.IsNthElement)
.Select(o => o.Element)
.ToArray();
}
Sample usage:
var arr = new[]
{
0,
1,
2,
3,
4,
5,
6,
7,
8
};
Console.WriteLine(string.Join(", ", GetEveryNthElement(arr, 3)));
The non-LINQ version of that code would be this:
private T[] GetEveryNthElement<T>(T[] array, int n)
{
var elements = new List<T>();
for (var i = 0; i < array.Length; i++)
{
if ((i + 1) % n == 0)
{
elements.Add(array[i]);
}
}
return elements.ToArray();
}
but this would be more efficient:
private T[] GetEveryNthElement<T>(T[] array, int n)
{
var elements = new List<T>();
for (var i = n - 1; i < array.Length; i += n)
{
elements.Add(array[i]);
}
return elements.ToArray();
}
EDIT:
Although I've never used it before, I should have realised that there is an overload of Where that uses indexes too, just as the Select method I used does. That means that my original code could be simplified to this:
private T[] GetEveryNthElement<T>(T[] array, int n)
{
return array.Where((elem, i) => (i + 1) % n == 0).ToArray();
}
As the elem value is no longer used, it can be a discard:
private T[] GetEveryNthElement<T>(T[] array, int n)
{
return array.Where((_, i) => (i + 1) % n == 0).ToArray();
}