NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Ladislav Niderle:6.1.2016 19:47

Ahoj, potřeboval bych poradit kde mám problém s kolekcí:

class ListKolekce
{
        public string Klic;
        public string info1;
        public string info2;
        public ListKolekce(string a1, string a2, string a3)
        {
                info1=a1;
                info2=a2;
                Klic =a3;
        }
}

class Program
{
        private void Pokus()
        {
                List<ListKolekce> kolekce = new List<ListKolekce>();
                ... zde je naplnění, takže vím, že tam na 100% jsou data správně naplněná
                //
                foreach (var item in kolekce)
                {
                        if (item.Klic == "mnou hledaný výraz, který je víckrát v kolekci")
                        {
                                kolekce.remove(item);
                        }
                }
        }
}

A právě u toho, když procházím tu kolekci a chci ji promazat, tak mi to udělá první výmaz , ale pro další průchod mi napíše, že kolekce byla pozměněna a tak mi to spadne na chybu. Neví někdo jak to mám pomocí foreach či něčemu lepšímu opravit?
Jinak jsem teď tento kód psal z hlavy, tak se omlouvám, zda mi tam chybí nějaká inicializace a ostatní věci nebo mám chybu v překlepu.

Předem moc děkuji za pomoc

 
Odpovědět
6.1.2016 19:47
Avatar
Tomáš Brabec:6.1.2016 19:56

Dej si tam novej list, kterým budeš procházet a pak ten prvek smažeš v tom původním... viz ukázka.

List<int> listCisel = new List<int>();
for (int i = 0; i < 10; i++)
{
    listCisel.Add(i);
}

foreach(int cislo in new List<int>(listCisel)) //zajímá tě hlavně tenhle řádek...
{
    if (cislo == 5)
        listCisel.Remove(cislo);
}
Editováno 6.1.2016 19:58
Nahoru Odpovědět
6.1.2016 19:56
Lidé se dělí do 10 skupin. Jedni dvojkovou soustavu znají a druzí ne.
Avatar
Odpovídá na Ladislav Niderle
Neaktivní uživatel:6.1.2016 20:00

Ahoj, toto se dá jednoduše obejít pomocí foru

for (int i = 0; i < list.Count; i++)
{
        //Pokračuješ stejně jako ve foreach..
}
Nahoru Odpovědět
6.1.2016 20:00
Neaktivní uživatelský účet
Avatar
Ladislav Niderle:7.1.2016 7:22

Tak jsem to nakonec udělal pomocí dalšího listu, kam jsem si uložil ty, které potřebuji smazat a pro další průchod jsem je již smazal. Vím, že je to větší režie, ale v tomto případě to moc nevadí, jelikož tam nikdy nebude tolik informací na smazání, aby to aplikaci zbrzdilo. Tak ještě jednou moc děkuji za pomoc.

 
Nahoru Odpovědět
7.1.2016 7:22
Avatar
JOF
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
JOF:12.1.2016 22:07

Ahoj,
tohle by nemuselo fungovat úplně správně.
Doporučuji při odstraňování prvků procházek kolekci od konce ;-)

 
Nahoru Odpovědět
12.1.2016 22:07
Avatar
Marian Benčat:14.1.2016 3:50

Tam nejde o to, že prochází kolekci od začátku, nebo od konce, ale o to, že foreach používá iterátor, takže si hlídá, že v kolekci nedošlo ke změně,.. proto je také foreach o něco náročnější, než běžný FOR. Nevymýšlejte žádné kopírování a jednoduše to projeďte od zadu FOR cyklem.

Nahoru Odpovědět
14.1.2016 3:50
Totalitní admini..
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.