Почему «.Remove» влияет на все элементы в 2D-структуре, которым назначен список? - PullRequest
0 голосов
/ 15 января 2019

В настоящее время я пытаюсь создать Решатель Судоку, и на этапе назначения некоторых возможных значений блоку, который еще не занят.(Немного справочной информации о том, почему я делаю этот шебанг: судоку - это игра чисел, основанная на сетке 9x9, ее контекстные правила позволяют определенным полям в сетке, которые не озабочены, содержать возможные значения в процессе решения)

Для этого я создал структуру, определил ее как двумерную и заполнил ее предопределенным списком целых чисел, используя цикл for.

Теперь, когда я попытался удалить одно целое число из спискаопределенного элемента в двумерной структуре, я обнаружил, что во всех списках элементов в структуре это целое число удалено.Вероятно, есть простое решение, но я действительно изо всех сил пытался найти его.Надеюсь, что приведенный ниже код проясняет несколько запутанное словесное объяснение.

Structure Element
    Dim PossibleValues As List(Of Integer)
    Dim ElementValue As Integer
End Structure

Sub Main()
    Dim List as New List(Of Integer)({1,2,3})
    Dim TDP(8,8) as Element
    For x as integer = 0 to 8
        For y as integer = 0 to 8
            TDP(x,y).PossibleValues = List
        Next
    Next
    TDP(0,0).PossibleValues.Remove(1)
End Sub

Теперь я ожидаю, что только TDP (0,0) будет иметь список «2,3» при выводе списка целых чисел, но когда я проверяю другие элементы, т.е. TDP (1,0)), его список целых чисел также "2,3"

1 Ответ

0 голосов
/ 15 января 2019

Посмотрите на задание здесь:

 TDP(x,y).PossibleValues = List

List(Of T) является ссылочным типом, поэтому он присваивает ссылку на один и тот же объект списка каждому из элементов массива.

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

Sub Main()
    Dim TDP(8,8) as Element
    For x as integer = 0 to 8
        For y as integer = 0 to 8
            TDP(x,y).PossibleValues = New List(Of Integer)({1,2,3})
        Next
    Next
    TDP(0,0).PossibleValues.Remove(1)
End Sub
...