Marc Kane Ответов: 1

Как получить первую неиспользуемую переменную из списка?


Я хочу найти первый неиспользуемый номер в списке, который содержит случайные числа, но я получаю эту ошибку. Может быть, вы скажете мне, что я здесь упускаю?

'Невозможно привести объект типа 'ObjectCollection' к типу 'System.Коллекции.Общий.IEnumerable`1[System.Int32]'.'

Что я уже пробовал:

 Dim FB As Integer = Enumerable.Range(0, Integer.MaxValue).Except(ListBox1.Items).FirstOrDefault()
MessageBox.Show(FB)

Dave Kreskowiak

Что ты на самом деле пытаешься с этим сделать? Все, что вы делаете, - это возвращаете перечислитель в диапазоне 2,147 миллиарда-1 целых чисел, и это действительно не кажется очень полезным.

1 Ответов

Рейтинг:
12

phil.o

Попробуйте привести элементы коллекции объектов обратно к целым числам:

Dim FB As Integer = Enumerable.Range(0, Integer.MaxValue).Except(ListBox1.Items.Cast(Of Integer)()).FirstOrDefault()

Однако это может не сработать, в зависимости от того, как вы заполнили список.

Edit: после нескольких секундных попыток загрузка в память диапазона более 2 миллиардов целых чисел может оказаться не самой лучшей идеей. Вы могли бы попробовать это вместо этого:
Public Function GetFirstAvailable() As Integer
   Dim list as New List(Of Integer)(ListBox1.Items.Cast(Of Integer)())
   For i As Integer = 0 To Integer.MaxValue
      If Not list.Contains(i)
         Return i
      End If
   Next
   Return -1 '' Have a way to tell there wasn't any available positive integer, even if it is not likely
End Function

Dim FB As Integer = GetFirstAvailable()


Richard Deeming

Enumerable.Range не загружает список в память; он оценивается лениво.

Except делает храните копию всех отдельных элементов из второго списка, который, по сути, является тем, что ваш GetFirstAvailable метод-это делание.
опорный источник[^]

Если вы использовали ListBox1.Items.Cast(Of Integer).Except(Enumerable.Range(0, Integer.MaxValue)), затем у тебя будут проблемы с памятью. :)

NB: Вам нужно переместить Return -1 за пределами города For петля.

phil.o

Спасибо, Ричард, я исправил расположение возвратного заявления. Спасибо также за уточнения по поводу Enumerable.Range поведение.