Hat man z.B. eine Liste mit Ids und möchte prüfen ob es dort Lücken gibt, kann man das ganz einfach wie folgt tun:

Im ersten Schritt (Zeile 8) wird die Liste einmal sortiert. Anschließend wird das erste Element (Zeile 11) und das letzte Element (Zeile 13) aus der Liste entnommen. Danach wird die Anzahl der Elemente (Zeile 15) ermittelt.

In Zeile 18 wird danach eine neue, komplette Liste erstellt. Anschließend werden die beiden Listen (rangeList, originalList) miteinander verglichen um zu schauen wo Lücken vorhanden sind. Diese Liste wird am Ende zurückgegeben.

Beispiel

Gehen wir davon aus, das wir die folgende Liste vorliegen haben:

var tempList = new List<int> { 3, 9, 14, 15 };
  • Erste Element (Zeile 11): 3
  • Letzte Element (Zeile 13): 15
  • Anzahl Elemente (Zeile 15): 13

Mit diesen Werten wird jetzt eine neue Liste erstellt, welche bei 3 beginnt und insgesamt 13 Elemente enthält:

var rangeList = Enumerable.Range(first, count);
// Result: 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15

Mit Except werden die beiden Listen jetzt mit einander verglichen. Als Ausgangspunkt wird hier die neu erstellte Liste genommen. Dagegen wird die original Liste gehalten. Als Ergebnis erhält man jetzt alle Einträge, welche in der neuen Liste (rangeList) vorhanden sind jedoch nicht in der originalen Liste (tmpList). Das Ergebnis sieht dann wie folgt aus:

var gapList = rangeList.Except(originalList);
// Result: 4, 5, 6, 7, 8, 10, 11, 12, 13

Das ganze ist jetzt relativ ausführlich geschrieben um einmal die einzelnen Steps zu verdeutlichen. Am Ende (Zeile 27) findet man aber noch mal einen kleinere Aufruf, so dass man sich die Zeilen 10 – 24 sparen kann.

return Enumerable.Range(originalList.First(), 
    originalList.Last() - originalList.First() + 1).
    Except(originalList).ToList();