Каков самый элегантный способ создания списка логических значений из 100 элементов, инициализированных в false

#arrays #vb.net #linq

Вопрос:

Очевидно, я могу это сделать

     Dim primeornot = New List(Of Boolean)
    For i = 1 To 100
        primeornot.Add(False)
    Next
 

Что на самом деле достаточно коротко и, вероятно, займет не намного больше времени, чем правильная версия.

Есть ли более правильный способ сделать это?

Ответ №1:

Вы можете использовать LINQ, если хотите более короткую версию:

 Dim primeornot = Enumerable.Repeat(False, 100).ToList()
 

Комментарии:

1. В качестве альтернативы, если вы не хотите звонить ToList , вы можете передать результат IEnumerable в качестве аргумента при объявлении нового списка: Dim collection = New List(Of Boolean)(Enumerable.Repeat(False, 100))

2. @Дэвид: Но это не делает код более читабельным, кратким или эффективным

3. Я бы не согласился с тем, чтобы не делать код более эффективным. Хотя я не копался в этом, моя интуиция подсказывает мне , что при вызове ToList у него будет снижение производительности, потому что ему придется перечислять коллекцию.

4. @David: Да, так же, как и в List(Of T) конструкторе, если вы передаете что-то, что не является коллекцией. Размер внутреннего массива списков необходимо изменить несколько раз(в два раза). Так что это то же самое, что и в коде ОП, но он попросил короткую и читабельную версию. Если вы хотите наиболее эффективный, вам нужно использовать Dim primeornot=New List(Of Boolean)(100) primeornot.AddRange(Enumerable.Repeat(False, 100)) , который также использует цикл, но не требует его изменения. Однако это микрооптимизация имо

Ответ №2:

У вас есть много способов создать коллекцию, как a List(Of T) или что-то еще.
В зависимости от варианта использования:

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

 Dim bList = New Boolean(99) {}.ToList()
 

На основе параметров, используя List(Of T) конструктор:

 Dim items = 100
Dim bList = New List(Of Boolean)(New Boolean(items - 1) {})

Dim times = 100 : Dim value = False
Dim bList = New List(Of Boolean)(Enumerable.Repeat(value, times))
 

Когда у вас есть два значения, которые определяют диапазон:

 Dim range As (iFrom As Integer, iTo As Integer, bValue As Boolean) = (50, 100, False)
Dim bList = Enumerable.Range(range.iFrom, range.iTo).Select(Function(b) range.bValue).ToList()
 

Когда вы предварительно создаете Func(Of T, [NumberOfItems], ReturnType(Of T)) :

 Dim myFunc = New Func(Of Boolean, Integer, IEnumerable(Of Boolean))
   (Function(b, i) Enumerable.Repeat(b, i))

' [...]
Dim bList = New List(Of Boolean)(myFunc(False, 100))
 

Универсальный метод, который возвращает IEnumerable(OF T) :

 Dim boolList = GetCollection(100, False).ToList()
Dim decimalList = GetCollection(100, 100D).ToList()

' [...]

Public Function GetCollection(Of T As {Structure})
    (howMany As Integer, baseValue As T) As IEnumerable(Of T)
    Return Enumerable.Repeat(baseValue, howMany)
End Function
 

Комментарии:

1. Этот хорош. Но я должен выбрать один правильный ответ

2. Конечно, это ваш вопрос, вы выбираете любой ответ, который хотите 🙂

Ответ №3:

Вы также можете использовать System.Collectios.BitArray вместо:

Dim bitArray As New System.Collections.BitArray(100)

Все 100 значений будут инициализированы false по умолчанию.

Ответ №4:

Я бы сказал, что это выглядит элегантно

     Dim trueifnotprime = New List(Of Boolean)(100)
 

Весь логический элемент автоматически устанавливается в значение false, не так ли?