Если входной список всегда сортируется, вы можете воспользоваться этим и выполнить простой линейный поиск:
List<int> numbers = new List<int>() { 11, 12, 13, 14 };
int result = numbers
.Zip(
numbers.Skip(1).Concat(new[] { int.MaxValue }),
(a, b) => (next: a+1, b))
.FirstOrDefault(x => x.next != x.b)
.next;
Это более уродливо, чем решение @ Enigmativity, но оно имеет преимущество, заключающееся в линейностиа не квадратичный, что будет иметь значение, если список чисел большой.
Лично я бы просто написал это как дешевый линейный цикл for:
for (int i = 0; i < numbers.Count - 1; i++)
{
int next = numbers[i] + 1;
if (next != numbers[i + 1])
{
return next;
}
}
return numbers[numbers.Count - 1] + 1;