[C# .NET] Collectionbase update probleem

Pagina: 1
Acties:

  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 20-05 21:32
Hoi,

Ik heb een typed collection gemaakt genaamd BaseBusinessEntityCollection. Elke item in de collection is een BaseBusinessEntity class.

Nu heeft BaseBusinessEntity 2 properties: id (string), en name (string).

Ik heb netjes de add, remove, indexof, insert, etc. gecast geimplementeerd, echter ik heb moeite met het updaten van een BaseBusinessEntity waarvan ik slechts de id meegeef.

Bijv: ik wil een remove doen uit de collection, maar ik heb slechts een id en geen instance van dat item uit de collectie. Hoe los ik dat op ?

Ik dacht zelf aan een IndexOf() of Equals override, maar daar kwam ik nog niet uit....

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

Je kan met een foreach toch gewoon de gehele colletion doorlopen en naar een object met het id zoeken.

Ik zou gewoon een 2e method maken, IndexOf(string id) ofzo. Dus waarmee je alleen het id meegeeft ipv het hele object.

  • Sebazztiaan
  • Registratie: Februari 2002
  • Laatst online: 21-04 16:53

Sebazztiaan

sebas!

Zoals questa al zei, je kan gewoon met foreach() door de collection heen, en dan de .Remove(object) aanroepen, mits al je id's in je collection verschillend zijn!

C#:
1
2
3
4
5
6
7
8
9
10
11
12
public bool Remove(int id)
{
    foreach(BusinessBaseEntity bBaseE in BusinessBaseEntityCollection)
    {
           if(bBaseE.id == id)
           {
                 BusinessBaseEntityCollection.Remove(bBase);
                 return true;
           }
    }
    return false;
}


Op deze manier hoef je niet de index te weten, dit is namelijk lastig om bij te houden, ook omdat je dingen tussenin je collection kan verwijderen. Ook omdat 'als' een remove gelukt is, return je true.

daarom zou je dit kunnen vragen:

C#:
1
2
3
4
if(collectionclass.Remove(integerValue))
{
     //logica om je verwijdering door te voeren in je app
}



this shall do the trick!

[ Voor 49% gewijzigd door Sebazztiaan op 28-10-2004 09:03 ]


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

Sebazztiaan schreef op 28 oktober 2004 @ 08:58:
Zoals questa al zei, je kan gewoon met foreach() door de collection heen, en dan de .Remove(object) aanroepen, mits al je id's in je collection verschillend zijn.

code:
1
2
3
4
public bool Remove(int id)
{
 ...
}


this shall do the trick!
Kan je niet beter een typed hashlist gebruiken ipv een collection ? Als key gebruik je dan id.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Je kunt niet removen in een foreach loop als je met de foreachloop diezelfde collection doorsjouwt, beginnersfout nummer 1 :+

Je moet Equals overriden in je BaseBusinessEntity class. Daar vergelijk je PK values met elkaar. Je kunt dan meteen IndexOf en Remove() gebruiken van CollectionBase :)

[ Voor 11% gewijzigd door EfBe op 28-10-2004 09:04 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Sebazztiaan
  • Registratie: Februari 2002
  • Laatst online: 21-04 16:53

Sebazztiaan

sebas!

Ja kan wel, maar omdat TS begon over een collection, en daar dus ook wel redenen voor heeft, heb ik gewoon antwoord op zijn vraag gegeven. Een linked-list zou ook mooi zijn om te gebruiken, ook omdat dit een heel snelle oplossing is.

  • Sebazztiaan
  • Registratie: Februari 2002
  • Laatst online: 21-04 16:53

Sebazztiaan

sebas!

EfBe schreef op 28 oktober 2004 @ 09:03:
Je kunt niet removen in een foreach loop als je met de foreachloop diezelfde collection doorsjouwt, beginnersfout nummer 1 :+

Je moet Equals overriden in je BaseBusinessEntity class. Daar vergelijk je PK values met elkaar. Je kunt dan meteen IndexOf en Remove() gebruiken van CollectionBase :)
ik kan je garanderen dat het onderstaande werkt:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public bool DeletePhotoByFileName(string strFileName)
{
    foreach(PhotoBookItem pbItem in _photobook)
    {
        if(pbItem.FileName == strFileName)
        {
            _photobook.Remove(pbItem);
            _nPhotosInPhotoBook--;
            _bIsUpdated = true;
            return true;
        }
    }
    return false;
}

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

EfBe schreef op 28 oktober 2004 @ 09:03:
Je kunt niet removen in een foreach loop als je met de foreachloop diezelfde collection doorsjouwt, beginnersfout nummer 1 :+
Ik had het ook niet over verwijderen maar over de index opvragen. Daarna kun je hem zelf verwijderen met RemoveAt(); O-)

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
EfBe schreef op 28 oktober 2004 @ 09:03:
Je kunt niet removen in een foreach loop als je met de foreachloop diezelfde collection doorsjouwt, beginnersfout nummer 1 :+
Hmm.... gaat foreach de enumerator van de collectie niet gaan aanspreken waardoor je eigenlijk niet over dezelfde 'list' loopt als de list waaruit je verwijderd?
Je loopt nl over de enumerator (die gecreeërd wordt door de GetEnumerator member van je collectie, je krijgt een 'los staande lijst terug' en je verwijderd uit je collectie - zelf.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Maar toch:
The foreach statement is used to iterate through the collection to get the desired information, but should not be used to change the contents of the collection to avoid unpredictable side effects.

https://fgheysels.github.io/


  • Sebazztiaan
  • Registratie: Februari 2002
  • Laatst online: 21-04 16:53

Sebazztiaan

sebas!

Maar toch is er altijd door mijn docenten tegen mij gezegd tijdens mijn opleiding:
Als je weet wat je fout doet, en waarom je het doet, en als het eigenlijk niet zo 'hoort', en als je weet waarom het niet hoort, ben je helemaal niet fout als je het niet op die manier implementeerd! Zolang je maar 'donders' goed weet wat je doet.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
whoami schreef op 28 oktober 2004 @ 09:30:
Hmm.... gaat foreach de enumerator van de collectie niet gaan aanspreken waardoor je eigenlijk niet over dezelfde 'list' loopt als de list waaruit je verwijderd?
Je loopt nl over de enumerator (die gecreeërd wordt door de GetEnumerator member van je collectie, je krijgt een 'los staande lijst terug' en je verwijderd uit je collectie - zelf.
Je krijgt een mooie exception hoor als je het probeert. Punt is dat de MoveNext van de enumerator de volgende niet kan bepalen want de collection is changed. Dit werkt eigenlijk al niet wanneer je OnListChanged events afvuurt in de collection waarover je enumerate.

De routine die gepost werd kan werken omdat de loop direct wordt afgebroken, maar IMHO is het gewoon fout om het zo op te lossen. In de loop zoek je de index, en dan remove je die daarna, of in de loop verzamel je objects die je moet verwijderen en dan verwijder je die in de loop erna, het is geen VB6 ;) :)
Maar toch is er altijd door mijn docenten tegen mij gezegd tijdens mijn opleiding:

----
Als je weet wat je fout doet, en waarom je het doet, en als het eigenlijk niet zo 'hoort', en als je weet waarom het niet hoort, ben je helemaal niet fout als je het niet op die manier implementeerd! Zolang je maar 'donders' goed weet wat je doet.
----
Goeie genade, dat meen je toch niet serieus he :X Zulke 'docenten' zijn het bewijs van "Those who can, do. Those who can't, teach", en deze docenten zouden hun preek op zichzelf moeten loslaten en een ander vak moeten gaan doen.

[ Voor 24% gewijzigd door EfBe op 28-10-2004 10:03 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Inderdaad, ik was verkeerd.
Ik dacht dat de GetEnumerator een aparte collectie ging gaan teruggeven, maar ik denk dat ik een beetje verward was met het Iterator pattern (GoF).
De geposte method werkt inderdaad omdat het boeltje afgebroken wordt.

https://fgheysels.github.io/

Pagina: 1