• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z funckją i listami w c#

Object Storage Arubacloud
0 głosów
209 wizyt
pytanie zadane 16 czerwca 2021 w C# przez Bartek12 Mądrala (5,510 p.)

Dzień dobry,

Mam kod

private void find2(List<molecule> _substraty, List<molecule> _produkty)
        {
            int myID = funcID;
            funcID++;

            List<element> sub = utils.getStats(_substraty);
            List<element> pro = utils.getStats(_produkty);

            textBox1.Text = utils.getText(_substraty);
            textBox2.Text = utils.getText(_produkty);

            //if (sub.Count != pro.Count) return;
            string s = "";
            List<molecule> tab = new List<molecule>();
            int ID = 0;

            for (int i = 0; i < sub.Count; i++)
            {
                if(sub[i].count != pro[i].count)
                {
                    if(sub[i].count > pro[i].count)
                    {
                        tab = _produkty;
                        ID = 2;
                    }
                    else
                    {
                        tab = _substraty;
                        ID = 1;
                    }
                    s = sub[i].symbol;
                    break;
                }
            }

            if (s == "")
            {
                textBox1.Text = utils.getText(_substraty);
                textBox2.Text = utils.getText(_produkty);
                MessageBox.Show("Uzgodniono!");
            }
            MessageBox.Show($"my state: {utils.getText(_substraty)} -> {utils.getText(_produkty)}");
            List<molecule> subState = _substraty;
            List<molecule> proState = _produkty;
            List<molecule> tabState = tab;

            for (int i = 0; i < tab.Count; i++)
            {
                //MessageBox.Show($"{utils.getText(_substraty)} -> {utils.getText(_produkty)}");
                MessageBox.Show(myID.ToString());
                if (tab[i].findInElements(s).Item1 != null)
                {
                    tab[i].count += 1;

                    if(ID == 1)
                    {
                        _substraty = tab;
                    }else if(ID == 2)
                    {
                        _produkty = tab;
                    }

                    if(tab[i].count < 3)
                    {
                        MessageBox.Show("Start " + funcID);
                        find2(_substraty, _produkty);
                    }
                    else
                    {
                        MessageBox.Show("TEST");
                        textBox1.Text = utils.getText(_substraty);
                        textBox2.Text = utils.getText(_produkty);
                    }
                    MessageBox.Show("data for: " + myID);
                    MessageBox.Show($"my first state: {utils.getText(subState)} -> {utils.getText(proState)}");
                    MessageBox.Show($"my state: {utils.getText(_substraty)} -> {utils.getText(_produkty)}");
                    _substraty = subState;
                    _produkty = proState;
                    tab = tabState;
                    MessageBox.Show($"retrun to: {utils.getText(_substraty)} -> {utils.getText(_produkty)}");
                }
            }

            MessageBox.Show("end " + myID);

        }

Listę subState i proState ustawiam przed drugą pętlą for. Po każdym wykonaniu tej pętli listy _substraty i _produkty mają wracać do stanu z przed pętli i robi to przypisanie do nich z powrotem list subState i proState.

Albo program zgłupiał albo ja. Bo jakimś cudem listy subState i proState się zmieniają podczas pętli for.

Do zbadanie tego użyłem message boxów i wynik był mniej więcej taki:

ten stan jest w subState i proState przed wykonaniem drugiej pętli

stan po wykonaniu

zamiast 3H2O powinno być H2O.

Wie ktoś czemu tak się dzieje?

1 odpowiedź

+2 głosów
odpowiedź 16 czerwca 2021 przez DarthMazut Bywalec (2,990 p.)
wybrane 17 czerwca 2021 przez Bartek12
 
Najlepsza

List<T> jest typem referencyjnym, w związku z tym przypisnie typu:

List<molecule> subState = _substraty;

powoduje, że od tej pory wskaźnik "subState" będzie wskazywał na tę samą listę co "_substraty". Działania odbywać będą się na tym samym obiekcie, niezależnie od tego przez który wskaźnik się do niego odwołasz. Na stercie wciąż jest jedna instancja listy.

Jeżeli potrzebujesz nowej instancji List<T> to klasa ta posiada przeciążony konstruktor do tworzenia instancji z innych kolekcji.

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1?view=net-5.0

P.S.

radzę nie nazywać argumentów formalnych z podkreślnikiem jako prefix, tak określane są pola prywatne w klasach.

komentarz 17 czerwca 2021 przez gagyn Stary wyjadacz (11,050 p.)

To ja tylko dodam link do SO, gdzie są przykłady różnych rozwiązań tego problemu

How do I clone a generic list in C#? - Stack Overflow

komentarz 17 czerwca 2021 przez Bartek12 Mądrala (5,510 p.)

@DarthMazut, o który konkretnie konstruktor ci chodzi?

komentarz 17 czerwca 2021 przez DarthMazut Bywalec (2,990 p.)
List<T>(IEnumerable<T>)

natomiast jeśli "molecule" nie jest typem wartościowym, sprawdź link, który zamieścił gagyn.

Podobne pytania

0 głosów
1 odpowiedź 142 wizyt
pytanie zadane 26 maja 2019 w C i C++ przez Fr3me Nowicjusz (120 p.)
0 głosów
1 odpowiedź 145 wizyt
pytanie zadane 6 marca 2023 w C i C++ przez martinez369 Początkujący (460 p.)
0 głosów
1 odpowiedź 263 wizyt
pytanie zadane 27 lutego 2023 w C i C++ przez martinez369 Początkujący (460 p.)

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...