using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
public static void Main()
var stopwatch = new Stopwatch();
const int iterations = 100;
for (int i = 0; i < iterations; i++)
var nonGenericTime = stopwatch.ElapsedTicks;
for (int i = 0; i < iterations; i++)
var genericTime = stopwatch.ElapsedTicks;
for (int i = 0; i < iterations; i++)
arr.IterateCollection(0);
var collectionTime = stopwatch.ElapsedTicks;
for (int i = 0; i < iterations; i++)
arr.IterateEnumerable(0);
var enumerableTime = stopwatch.ElapsedTicks;
Console.WriteLine("Non generic: " + nonGenericTime);
Console.WriteLine("Generic: " + genericTime);
Console.WriteLine("Collection: " + collectionTime);
Console.WriteLine("Enumerable: " + enumerableTime);
public static class Extensions
public static int Iterate(this Array arr, int current, int amount = 1) => (current + amount) % arr.Length;
public static int IterateGeneric<T>(this T[] arr, int current, int amount = 1) => (current + amount) % arr.Length;
public static int IterateCollection(this ICollection collection, int current, int amount = 1) => (current + amount) % collection.Count;
public static int IterateEnumerable<T>(this IEnumerable<T> enumerable, int current, int amount = 1) => (current + amount) % enumerable.Count();