• 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#

Fiszki IT
Fiszki IT
0 głosów
52 wizyt
pytanie zadane 16 czerwca w C# przez Bartek12 Mądrala (5,430 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 przez DarthMazut Bywalec (2,870 p.)
wybrane 17 czerwca 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 przez gagyn Stary wyjadacz (10,490 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 przez Bartek12 Mądrala (5,430 p.)

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

komentarz 17 czerwca przez DarthMazut Bywalec (2,870 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ź 100 wizyt
pytanie zadane 26 maja 2019 w C i C++ przez Fr3me Nowicjusz (120 p.)
0 głosów
1 odpowiedź 78 wizyt
pytanie zadane 21 listopada 2018 w C i C++ przez GFSidonis Nowicjusz (120 p.)
+1 głos
0 odpowiedzi 102 wizyt
pytanie zadane 27 grudnia 2020 w C# przez Szyszka Gaduła (3,010 p.)
Porady nie od parady
Nie wiesz jak poprawnie zredagować pytanie lub pragniesz poznać którąś z funkcji forum? Odwiedź podstronę Pomoc (FAQ) dostępną w menu pod ikoną apteczki.FAQ

84,758 zapytań

133,561 odpowiedzi

295,987 komentarzy

56,012 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...