Общие списки копируют ссылки, а не создают copiedList - PullRequest
3 голосов
/ 08 марта 2010

Я разрабатывал небольшую функцию, пытаясь запустить перечислитель по списку и затем выполнить какое-то действие. (Ниже приводится идея того, что я пытался сделать.

При попытке удалить я получил «коллекцию нельзя изменить», которая после того, как я на самом деле проснулся, понял, что tempList, должно быть, только что была назначена ссылка myLists, а не копия myLists. После этого я попытался найти способ сказать

tempList = myList.copy

Однако, кажется, ничего не существует ?? В итоге я написал небольшой цикл for, который затем просто добавил каждый элемент из myLsit в tempList, но я бы подумал, что был бы другой механизм (например, клон ??)

Итак, мой вопрос (ы):

  • мое предположение о том, что tempList получает ссылку на myList, правильное
  • Как список должен быть скопирован в другой список?

        private myList as List (Of something)
    
    sub new()
        myList.add(new Something)
    end sub
    
    sub myCalledFunction()
        dim tempList as new List (Of Something)
        tempList = myList
        Using i as IEnumerator = myList.getEnumarator
           while i.moveNext
               'if some critria is met then 
               tempList.remove(i.current)
           end
        end using
    
    end sub
    

Ответы [ 4 ]

8 голосов
/ 08 марта 2010

При написании tempList = myList вы не делаете копию коллекции, вы только делаете ссылку на tempList myList. Попробуйте вместо этого: dim tempList as new List (Of Something)(myList)

0 голосов
/ 08 марта 2010

Я думаю, что если вы вызвали myCalledFunction (byVal aListCopy as Something), вы можете позволить фреймворку делать свою работу.

0 голосов
/ 08 марта 2010

Если ваш список состоит из типов значений, вы можете просто создать новый список со старым списком, переданным в конструкторе. Если вы собираетесь делать глубокую копию ссылочного объекта, лучше всего, чтобы ваш ссылочный тип реализовал ICloneable ( пример ). Затем вы можете выполнить цикл и клонировать каждый объект или добавить метод расширения (например, c # пример ).

0 голосов
/ 08 марта 2010

Попробуйте - используйте LINQ для создания нового списка из оригинала, например:

Sub Main()
        Dim nums As New List(Of Integer)

        nums.Add(1)
        nums.Add(2)
        nums.Add(3)
        nums.Add(4)

        Dim k = (From i In nums _
                 Select i).ToList()

    For Each number As Integer In nums
        k.Remove(number)
    Next
    End Sub

k будет тогда новым списком номеров, которые не связаны с источником.

...