C# обновление объекта в списке - PullRequest
0 голосов
/ 20 марта 2020

У меня есть этот список объектов с именем list<product> A в классе USER, в основной программе, которую мы называем списком C.

, список A будет обновляться каждый раз, когда пользователь покупает что-то из другого list<product> B (это относится к основному классу), которое содержит каждый продукт, который у нас есть, и некоторую дополнительную информацию о том, сколько это стоит (в зависимости от возраста пользователя) и когда он был куплен (какая переменная существует из продукта класс, хотя он пуст, когда находится внутри списка A, так как я хочу сохранить только имя продукта и описание продукта в списке B).

Если продукт, купленный пользователем, отсутствует в списке B, он напечатает «Продукт не существует». Если он существует, он добавит продукт, купленный пользователем, в список А. Программа работает не так, как задумано, процесс добавления в список А выполняется нормально (хотя каким-то образом обновляет продукт списка В с тем же именем?), Если пользователь покупает другой продукт, но если это тот же продукт, список А будет обновлять каждый список в списке продуктов ???

Вот код товара для добавления:

public static Produk Sehat = new Produk("Sehat Bersama",EnumJenisKesehatan.Kesehatan
        ,EnumFrequensi.Bulanan,"Claim Perawatan kelas 1");

public static Produk SehatExtr = new Produk("Sehat Extra", EnumJenisKesehatan.Kesehatan
        , EnumFrequensi.Bulanan, "Claim Perawatan VIP"); 

public static List<Produk> allprod = new List<Produk>()
        { Sehat,SehatExtr};

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

Tempuser._produk.Add(produk);

Вот тот, который добавляет цену в классе пользователя к списку товаров (опять же с предположением, что мы уже получили продукт из списка пользователей [продукт]).

int price;

if (User._age < 20)
{
    price= 200000m;
    product._price= price;
}
else
{    
    price=300000m;  
    product._price=price; 
}

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

Пожалуйста, кто-нибудь, есть какое-то решение для этого?

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Вероятно, вы разделяете один и тот же объект (ссылку) между двумя списками, поэтому цена / имя / или что-либо еще будет отражено в обоих списках (так как это один и тот же объект).

Можно придумать ссылка как лист бумаги с адресом физического местоположения stuff . Когда вы добавляете ссылку в список или копируете ее. Вы просто копируете этот листок бумаги (адрес). Когда вы изменяете свойство, оно ищет фактическое физическое местоположение и меняет материал для всех.

Что вам нужно сделать, это клонировать ваш продукт. Есть много способов сделать это, некоторые проще, чем другие. Однако самый фундаментальный способ - просто скопировать свойства и состояние. Так что внутреннее состояние одинаковое.

var newProduk = new Produk() 
                     {
                         Price = produk.Price,
                         Name = produk.Name,
                         ...
                         // the rest of your state and properties
                     };

Tempuser._produk.Add(newProduk );
0 голосов
/ 20 марта 2020

Когда вы назначаете продукт из списка B в список A, вы назначаете ссылку на продукт, а не его копию, поэтому, когда вы изменяете его в списке A, вы фактически меняете тот же продукт в списке B , тоже.

Если вам нужно копирование, то клонируйте объект в B для получения списка A. Вот пример того, как клонировать объект:

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var listA = new List<MyObj>();
        var listB = new List<MyObj>();

        listB.Add(new MyObj{Name="John", Surname="Smith"});
        listA.Add((MyObj)listB[0].Clone());

        listA[0].Name = "Michael"; 

        Console.WriteLine(listA[0].Name);
        Console.WriteLine(listB[0].Name); 
    }
}

class MyObj: ICloneable
{
    public string Name {get;set;}
    public string Surname {get;set;}

    public object Clone() 
    {
        return (MyObj)this.MemberwiseClone();
    }
}

Вы можете запустить этот образец в https://dotnetfiddle.net чтобы увидеть это в действии.

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...