[C#] Niet alle objecten uit InnerList worden verwijderd

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met het verwijderen van bepaalde objecten die ik wil verwijderen uit een InnerList

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        public void deleteMail()
        {
            object o = null;
                for (int i = 0; i <= InnerList.Count; i++)
                {
                    if (((EmailMessage)InnerList[i]).CanDelete)
                    {
                        InnerList.RemoveAt(i);
                        if (ItemRemoved != null)
                            ItemRemoved(o, EventArgs.Empty);

                    }   
            }
        }


In het Emailmessage object bestaat een canDelete bool die ergens op true wordt gezet als dit het geval is dan moet de message worden verwijderd. En als er 1 mail in staat dan lukt het wel maar zogauw er meer als 1 inzitten dan laat ie er altijd 1 of meer staan. Ik heb al gekeken met debug wat er precies gebeurt maar kan er niet achter komen. Wat kan ik het beste doen om dit op te lossen

[ Voor 4% gewijzigd door Verwijderd op 17-11-2007 14:38 ]


Acties:
  • 0 Henk 'm!

  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 05-08 09:21

Not Pingu

Dumbass ex machina

Hebben alle items wel CanDelete op true staan?

Dit:
code:
1
i <= InnerList.Count;


gaat trouwens niet werken omdat je index (i) zero-based is en Count 1-based. Dus:

code:
1
i < InnerList.Count;

Certified smart block developer op de agile darkchain stack. PM voor info.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Not Pingu schreef op zaterdag 17 november 2007 @ 14:49:
Hebben alle items wel CanDelete op true staan?

Dit:
code:
1
i <= InnerList.Count;


gaat trouwens niet werken omdat je index (i) zero-based is en Count 1-based. Dus:

code:
1
i < InnerList.Count;
Dat klopt die heb ik ook al verandert kreeg namelijk een exception. En heb ook gecontroleerd of alle bools op true stonden en dit was dan ook altijd het geval

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
Dat is logisch als je je items van begin naar einde doorloopt en ondertussen verwijderd.
Stel je hebt 3 items in je list, je verwijderd er één van, dan is je Count niet meer 3, maar 2 etc...

Je lijst van achter naar voor doorlopen dus:
code:
1
2
3
4
5
for( int i = list.Count - 1; i >= 0; i-- )
{
   // blaat
   list.RemoveAt (i);
}

[ Voor 16% gewijzigd door whoami op 17-11-2007 15:19 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

Het probleem is dat als je .RemoveAt(i) doet, dat alle items dan natuurlijk naar voren opschuiven, terwijl je de counter i onvoorwaardelijk ophoogt. Op dat moment "skip" je er dus 1 ... een oplossing zou b.v. zijn: .RemoveAt(i--); (= verlaag i met 1 na het verwijderen) ...

'Political Correctness is fascism pretending to be good manners.' - George Carlin


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok dankjewel voor de oplossingen zo simpel en toch kwam ik er neit op maar het werkt nu prima :)
Pagina: 1