Как получить следующий более высокий номер в списке? - PullRequest
3 голосов
/ 27 апреля 2020

Я хочу извлечь следующее наибольшее число после myNumber из списка list. Список всегда сортируется.

List<int> list = new List<int>();

int myNumber = 26

list.Add(2);     
list.Add(3);     
list.Add(7);
list.Add(9);     
list.Add(13);     
list.Add(22);
list.Add(26);     
list.Add(29);     
list.Add(45);

Как вы можете видеть, следующее более высокое число, равное 26, равно 29, поэтому оно должно вернуть его. Я хочу захватить, чем число в отдельном результате int.

Console.WriteLine(result);

Ответы [ 4 ]

3 голосов
/ 27 апреля 2020

Поскольку список отсортирован, вы можете использовать List.BinarySearch , чтобы найти элемент в O (log N), а не O (N):

var index = list.BinarySearch(myNumber);
if(index >= 0)
{
  int nextNumber = list[index + 1];
}
else
{
  // Not found
}
3 голосов
/ 27 апреля 2020

Вы можете получить последний индекс элемента в списке, затем получить следующий элемент или вернуть 0 (или любое другое значение по умолчанию), если достигнут конец списка

var index = list.LastIndexOf(myNumber);
var result = index < list.Count - 1 ? list[index + 1] : 0;

Вы можете также выдает исключение в случае, если достигнут последний элемент

var result = index < list.Count - 1 ? list[index + 1] : throw new Exception("End of list");

Согласно комментариям, если число отсутствует в списке (index равно -1), и требуется ближайший номер, дополнительная проверка может быть использован

var index = list.LastIndexOf(myNumber);
var highest = index >= 0 && index < list.Count - 1 ? list[index + 1] : list[list.Count - 1];
var lowest = index > 0 ? list[index - 1] : list[0];
1 голос
/ 27 апреля 2020

Если ваш список не всегда отсортирован.

var orderedList = list.OrderBy(number => number).ToList();
var index = orderedList.LastIndexOf(myNumber) + 1
var result = index < list.Count
    ? list[index]
    : throw new ArgumentOutOfRangeException("Highest number already reached")
0 голосов
/ 27 апреля 2020

Вот расширенная версия ответа Шона:

var index = list.BinarySearch(myNumber);
if (index >= 0)
{
    int nextNumber = list[index + 1];
    Console.WriteLine("NextNumber: " + nextNumber);

    int previousNumber = list[index - 1];
    Console.WriteLine("PreviousNumber: " + previousNumber);
}
else
{
    // Not found
    var newIndex = ~index;
    if (newIndex > list.Count - 1)
    {
        Console.WriteLine("myNumber wasn't found in list, myNumber is higher than any entry in list");
        Console.WriteLine("NextNumber: " + int.MaxValue);
        Console.WriteLine("PreviousNumber: " + list[newIndex - 1]);
    }
    else
    {
        Console.WriteLine("myNumber wasn't found in list, newIndex is the next higher number");
        Console.WriteLine("NextNumber: " + list[newIndex]);

        if (newIndex == 0)
        {
            Console.WriteLine("myNumber is lower than any entry in list");
            Console.WriteLine("PreviousNumber: " + int.MinValue);
        }
        else
        {
            Console.WriteLine("PreviousNumber: " + list[newIndex - 1]);
        }
    }
}

Вы можете увидеть его в действии здесь:

https://dotnetfiddle.net/g1cbMb

...