Получить минимально доступное число в списке целых чисел - PullRequest
0 голосов
/ 10 февраля 2019

Как получить минимально доступное число в списке целых чисел с помощью LINQ?Число не может быть меньше 10.

List<int> numbers = new List<int>() { 10, 11, 12, 22, 23 };

Я хочу вернуть 13 в этом случае.

List<int> numbers1 = new List<int>() { 11, 12, 22, 23 };

Я хочу вернуть 10 в этом случае

Какя могу сделать это с помощью LINQ?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Если входной список всегда сортируется, вы можете воспользоваться этим и выполнить простой линейный поиск:

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;
0 голосов
/ 10 февраля 2019

Я бы использовал это:

List<int> numbers = new List<int>() { 11, 12, 22, 23 };

int result = Enumerable.Range(10, numbers.Count + 1).First(x => !numbers.Contains(x));

Использование numbers.Count + 1 обрабатывает случай, когда List<int> numbers = new List<int>() { 10, 11, 12, 13, 14, 15 };

...