Ich denke, dass wenn Sie eine Linq-Erweiterung bereitstellen, Sie in der Lage sein sollten, auf das ungenaueste Interface, also auf IEnumerable, zu arbeiten. Natürlich, wenn Sie besonders schnell sind, insbesondere für große N, könnten Sie eine Überladung für den indexierten Zugriff bereitstellen. Letzteres entfernt die Notwendigkeit, über große Mengen von nicht benötigten Daten zu iterieren, und wird viel schneller sein als die Where-Klausel. Das Bereitstellen beider Überladungen ermöglicht es dem Compiler, die am besten geeignete Variante auszuwählen.
public static class LinqExtensions
{
public static IEnumerable GetNth(this IEnumerable list, int n)
{
if (n < 0)
throw new ArgumentOutOfRangeException("n");
if (n > 0)
{
int c = 0;
foreach (var e in list)
{
if (c % n == 0)
yield return e;
c++;
}
}
}
public static IEnumerable GetNth(this IList list, int n)
{
if (n < 0)
throw new ArgumentOutOfRangeException("n");
if (n > 0)
for (int c = 0; c < list.Count; c += n)
yield return list[c];
}
}