Is er een manier om twee objects te vergelijken of deze dezelfde referentie hebben?
Ik zit met een programma waarvan ik de structuur van een object wil bijhouden. Hiervoor overloop ik alle members van dit object. het probleem is dat men soms members kan hebben welke terug verwijzen naar het parent object. Wanneer hier geen rekening mee gehouden wordt krijgen we dus een oneindige loop.
Ik dacht, ik hou een lijst van alle objecten bij welke ik al doorlopen heb. Elke keer ik een nieuw object wil overlopen kijk ik in mijn lijst of deze al bestaat aan de hand van zijn reference. ReferenceEquals leek hier een goede manier voor maar ik vond volgende uitleg terug:
"The difficulty comes from the fact that ReferenceEquals expects two System.Objects as parameters. This means that our value types will get boxed onto the heap as they are passed in to this routine. Normally, because of the way the boxing process works, they will get boxed separately to different memory addresses on the heap. This of course means the call to ReferenceEquals returns false."
Dit ondervond ik toen ik volgende probeerde:
Hoewel ik zeker was dat er objecten dubbel in de arraylist zaten, bleef ik maar false als result terug te krijgen. Ook al voegde ik een object toe waarvan ik 100% was dat deze er al zat. (direct te merken aan de oneindige loop bij mijn algoritme)
Is er een andere manier om te vergelijken of twee objecten hetzelfde zijn? Ik had al gelezen dat men hiervoor soms een hashtable gebruikt:
In bovenstaande manier gaat volgens ik gelezen heb de ReferenceComparer gebruikt worden wanneer men de Contains methode oproept. Twee problemen, blijkbaar wordt deze toch niet opgeroepen en tweede probleem: krijgen we weer niet te maken met het boxing probleem eerder uitgelegd.
Even nog voor de duidelijkheid, ik wil niet weten of een object dezelfde waarde heeft. Ik wil weten of deze dezelfde reference heeft als een eerder toegevoegd object. Wanneer dit zo is, weet ik dat ik er niet verder hoef naar te kijken.
Ik zit met een programma waarvan ik de structuur van een object wil bijhouden. Hiervoor overloop ik alle members van dit object. het probleem is dat men soms members kan hebben welke terug verwijzen naar het parent object. Wanneer hier geen rekening mee gehouden wordt krijgen we dus een oneindige loop.
Ik dacht, ik hou een lijst van alle objecten bij welke ik al doorlopen heb. Elke keer ik een nieuw object wil overlopen kijk ik in mijn lijst of deze al bestaat aan de hand van zijn reference. ReferenceEquals leek hier een goede manier voor maar ik vond volgende uitleg terug:
"The difficulty comes from the fact that ReferenceEquals expects two System.Objects as parameters. This means that our value types will get boxed onto the heap as they are passed in to this routine. Normally, because of the way the boxing process works, they will get boxed separately to different memory addresses on the heap. This of course means the call to ReferenceEquals returns false."
Dit ondervond ik toen ik volgende probeerde:
C#:
1
2
3
4
5
6
7
8
9
10
11
| public bool containsObject(ArrayList list, Object obj) { bool found = false; for (int i = 0; i < list.Count && found == false; i++) { found = Object.ReferenceEquals(obj, list[i]); } return found; } |
Hoewel ik zeker was dat er objecten dubbel in de arraylist zaten, bleef ik maar false als result terug te krijgen. Ook al voegde ik een object toe waarvan ik 100% was dat deze er al zat. (direct te merken aan de oneindige loop bij mijn algoritme)
Is er een andere manier om te vergelijken of twee objecten hetzelfde zijn? Ik had al gelezen dat men hiervoor soms een hashtable gebruikt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| Hashtable stackMap = new Hashtable( null, new ReferenceComparer() ); .... stackMap.Add( oo, "" ); stackMap.Contains( oo ) //true hier .... private class ReferenceComparer : IComparer { #region IComparer Members public int Compare( object x, object y ) { return object.ReferenceEquals( x, y ) ? 0 : -1; } #endregion } |
In bovenstaande manier gaat volgens ik gelezen heb de ReferenceComparer gebruikt worden wanneer men de Contains methode oproept. Twee problemen, blijkbaar wordt deze toch niet opgeroepen en tweede probleem: krijgen we weer niet te maken met het boxing probleem eerder uitgelegd.
Even nog voor de duidelijkheid, ik wil niet weten of een object dezelfde waarde heeft. Ik wil weten of deze dezelfde reference heeft als een eerder toegevoegd object. Wanneer dit zo is, weet ik dat ik er niet verder hoef naar te kijken.
[ Voor 13% gewijzigd door Tyf op 16-05-2007 00:50 ]