Изменение значения элемента в списке структур

Лучшим способом (рекомендуется) является использование пакета java.util.Concurrent. Используя этот пакет, вы можете легко избежать этого исключения. см. Модифицированный код

public static void main(String[] args) {
        Collection<Integer> l = new CopyOnWriteArrayList<Integer>();

        for (int i=0; i < 10; ++i) {
            l.add(new Integer(4));
            l.add(new Integer(5));
            l.add(new Integer(6));
        }

        for (Integer i : l) {
            if (i.intValue() == 5) {
                l.remove(i);
            }
        }

        System.out.println(l);
    }
61
задан Rohit Vipin Mathews 2 June 2015 в 10:31
поделиться

3 ответа

MyList[1] = new MyStruct("bob");

структуры в C# должны почти всегда разрабатываться, чтобы быть неизменными (то есть, не чтобы иметь способ изменить их внутреннее состояние, как только они были созданы).

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

37
ответ дан CodeCaster 24 November 2019 в 17:20
поделиться

Не совсем. При разработке типа, поскольку класс или структура не должны управляться потребностью сохранить его в наборах:) Необходимо посмотреть на 'семантику', необходимую

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

Struct obItem = MyList[1];

, что происходит, - то, что новый экземпляр структуры создается, и все участники копируются один за другим. Так, чтобы у Вас был клон MyList[1] т.е. 2 экземпляров. Теперь при изменении obItem он не влияет на оригинал.

obItem.Name = "Gishu";  // MyList[1].Name still remains "peter"

Теперь терпят меня в течение 2 минут здесь (Это требует времени для проглатывания.. это сделало для меня:) При реальной необходимости в структурах, которые будут сохранены в наборе и изменены как Вы обозначенный в Вашем вопросе, необходимо будет заставить структуру представить интерфейс ( Однако, это приведет к упаковке ). Можно тогда изменить фактическую структуру через интерфейсную ссылку, которая относится к помещенному в коробку объекту.

следующий фрагмент кода иллюстрирует то, что я просто сказал выше

public interface IMyStructModifier
{
    String Name { set; }
}
public struct MyStruct : IMyStructModifier ...

List<Object> obList = new List<object>();
obList.Add(new MyStruct("ABC"));
obList.Add(new MyStruct("DEF"));

MyStruct temp = (MyStruct)obList[1];
temp.Name = "Gishu";
foreach (MyStruct s in obList) // => "ABC", "DEF"
{
    Console.WriteLine(s.Name);
}

IMyStructModifier temp2 = obList[1] as IMyStructModifier;
temp2.Name = "Now Gishu";
foreach (MyStruct s in obList) // => "ABC", "Now Gishu"
{
    Console.WriteLine(s.Name);
}

HTH. Хороший Вопрос.
Обновление: @Hath - у Вас был я работающий, чтобы проверить, пропустил ли я что-то что простой. (Это было бы непоследовательно, если свойства метода set не делают и методы сделали-.Net вселенная все еще сбалансирована:)
Метод установщика не работает
, obList2[1] возвращает копию, состояние которой было бы изменено. Исходная структура в списке остается неизмененной. Таким образом, Набор через интерфейс, кажется, только способ сделать это.

List<MyStruct> obList2 = new List<MyStruct>();
obList2.Add(new MyStruct("ABC"));
obList2.Add(new MyStruct("DEF"));
obList2[1].SetName("WTH");
foreach (MyStruct s in obList2) // => "ABC", "DEF"
{
    Console.WriteLine(s.Name);
}
43
ответ дан kruoli 24 November 2019 в 17:20
поделиться

Это не так, что структуры "неизменны".

реальная базовая проблема - то, что структуры являются типом Значения, не Ссылочным типом. Таким образом, когда Вы вытаскиваете "ссылку" на структуру из списка, она создает новую копию всей структуры. Так любые изменения Вы делаете на нем, изменяют копию, не исходную версию в списке.

Как состояния Andrew, необходимо заменить всю структуру. Как та точка, хотя я думаю, что необходимо спросить себя, почему Вы используете структуру во-первых (вместо класса). Удостоверьтесь, что Вы не делаете его вокруг преждевременных проблем оптимизации.

11
ответ дан Jason Olson 24 November 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: