[Mono-list] Object Lookup with a Compound key
A Rafael D Teixeira
rafaelteixeirabr@hotmail.com
Wed, 19 Jun 2002 23:26:34 -0300
>From: "Dwivedi , Ajay Kumar" <AjayKumar.Dwivedi@dresdner-bank.com>
>
>Hi All,
> I need to store and retrieve objects with a compound key.
>This is required for the SoapAttributeOverrides class. The class
>stores SoapAttributes object for each Member of a class. So the
>key to be used in the hashtable consists of Type of the class and
>Name of the member.
> Now I have 3 ways in which this can be implemented.
>
>1. Make the key as 'Type.FullType+".."+MemberName' , with ".."
> seperating Type and Member. This assumes that ".." can't occur
> in the FullName or MemberName. This is the easiest, but I am
> not sure if this is a language neutral approach.
No names accepts whitespace (at least for languages taht comply with the
CLR), so you could use a space or a newline to concatenate those two
strings. But I would not go that route.
>2. Use a jagged 2D hashtable. The main hashtable is indexed by
> Type and each value contains another hashtable which is
> indexed by member names. However this approach might require
> too many hashtables.
I think itīs too expensive...
>3. Use a new class which emcompasses the Type and MemberName and
> use it as a key. This approach would however require creation
> of a new key everytime a search is made.
I would try this one, but I would try to hide these details inside a
tailored subclass of hashtable. Something like:
class SoapAttributesCollection : Hashtable
{
struct specialKey
{
string typeKeyPart;
string memberKeyPart;
public specialKey(System.Type typeKeyPart, string memberKeyPart)
{
this.typeKeyPart = typeKeyPart.FullTypeName;
this.memberKeyPart = memberKeyPart;
}
}
// Indexer
public SoapAttributes this[
System.Type typeKeyPart,
string memberKeyPart]
{
get {
return (SoapAttributes)(this[specialKey(typeKeyPart, memberKeyPart)]);
}
set {
this[specialKey(typeKeyPart, memberKeyPart)] = value;
}
}
public void Add(
System.Type typeKeyPart,
string memberKeyPart,
SoapAttributes value )
{
Add(new specialKey(typeKeyPart, memberKeyPart), value);
}
// so on for ContainsKey, Remove... if needed
}
I would also experiment with tailoring the hashcodeprovider (hcp member) to
see if I could use System.Type inside the specialKey structure.
Hope it is of some help for you...
Wonderfull Hacking
Rafael Teixeira
Brazilian Developer
_________________________________________________________________
Chat with friends online, try MSN Messenger: http://messenger.msn.com