Diskuze: c# problém s kolekcí

C# .NET .NET (C# a Visual Basic) c# problém s kolekcí American English version English version

Avatar
niderle.l
Člen
Avatar
niderle.l:

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. ledna 19:47
Avatar
Tomáš Brabec:

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. ledna 19:58
Nahoru Odpovědět  -2 6. ledna 19:56
Lidé se dělí do 10 skupin. Jedni dvojkovou soustavu znají a druzí ne.
Avatar
David Hanina
Člen
Avatar
Odpovídá na niderle.l
David Hanina:

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  +5 6. ledna 20:00
Avatar
niderle.l
Člen
Avatar
niderle.l:

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  ±0 7. ledna 7:22
Avatar
JOF
Tým ITnetwork
Avatar
Odpovídá na David Hanina
JOF:

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  +1 12. ledna 22:07
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

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. ledna 3:50
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.