dictionary or collection

J

jg

I was trying to get custom dictionary class that can store generic or
string[]; So I started with the example given by the visual studio 2005 c#
online help for simpledictionay object

That seem to miss a few things including #endregion directive and the ending
class }

Is there not a simple way like in dotnet vb?

I managed to get the sample to code to this:
using System;
using System.Collections;
using Microsoft.Win32;

// This class implements a simple dictionary using an array of
DictionaryEntry objects (key/value pairs).
public class IeDictionary: IDictionary
{
// The array of items
private DictionaryEntry[] items;
private Int32 ItemsInUse = 0;

// Construct the IeDictionarywith the desired number of items.
// The number of items cannot change for the life time of this
SimpleDictionary.
public IeDictionary(Int32 numItems)
{
items = new DictionaryEntry[numItems];
}


#region IDictionary Members
public bool IsReadOnly { get { return false; } }
public bool Contains(object key)
{
Int32 index;
return TryGetIndexOfKey(key, out index);
}
public bool IsFixedSize { get { return false; } }
public void Remove(object key)
{
if (key == null) throw new ArgumentNullException("key");
// Try to find the key in the DictionaryEntry array
Int32 index;
if (TryGetIndexOfKey(key, out index))
{
// If the key is found, slide all the items up.
Array.Copy(items, index + 1, items, index, ItemsInUse - index -
1);
ItemsInUse--;
}
else
{
// If the key is not in the dictionary, just return.
}
}
public void Clear() { ItemsInUse = 0; }
public void Add(object key, object value)
{
// Add the new key/value pair even if this key already exists in the
dictionary.
if (ItemsInUse == items.Length)
throw new InvalidOperationException("The dictionary cannot hold
any more items.");
items[ItemsInUse++] = new DictionaryEntry(key, value);
}
public ICollection Keys
{
get
{
// Return an array where each item is a key.
Object[] keys = new Object[ItemsInUse];
for (Int32 n = 0; n < ItemsInUse; n++)
keys[n] = items[n].Key;
return keys;
}
}
public ICollection Values
{
get
{
// Return an array where each item is a value.
Object[] values = new Object[ItemsInUse];
for (Int32 n = 0; n < ItemsInUse; n++)
values[n] = items[n].Value;
return values;
}
}
public object this[object key]
{
get
{
// If this key is in the dictionary, return its value.
Int32 index;
if (TryGetIndexOfKey(key, out index))
{
// The key was found; return its value.
return items[index].Value;
}
else
{
// The key was not found; return null.
return null;
}
}

set
{
// If this key is in the dictionary, change its value.
Int32 index;
if (TryGetIndexOfKey(key, out index))
{
// The key was found; change its value.
items[index].Value = value;
}
else
{
// This key is not in the dictionary; add this key/value
pair.
Add(key, value);
}
}
}
private Boolean TryGetIndexOfKey(Object key, out Int32 index)
{
for (index = 0; index < ItemsInUse; index++)
{
// If the key is found, return true (the index is also
returned).
if (items[index].Key.Equals(key)) return true;
}

// Key not found, return false (index should be ignored by the
caller).
return false;
}
#endregion
}

But I got alot erors. Mostly on those I don't plant to use
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.IDictionary.GetEnumerator()'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.ICollection.CopyTo(System.Array, int)'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.ICollection.Count'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.ICollection.SyncRoot'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.ICollection.IsSynchronized'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.IEnumerable.GetEnumerator()'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
 
N

Nicholas Paldino [.NET/C# MVP]

jg,

If you are using VS.NET 2005, why not just use:

Dictionary<object, object>

Or a Hashtable?

As for your compiler errors, the interfaces you are implementing derive
from other interfaces. You have to implement those members as well.

Hope this helps.

--
- Nicholas Paldino [.NET/C# MVP]
- (e-mail address removed)

jg said:
I was trying to get custom dictionary class that can store generic or
string[]; So I started with the example given by the visual studio 2005 c#
online help for simpledictionay object

That seem to miss a few things including #endregion directive and the
ending class }

Is there not a simple way like in dotnet vb?

I managed to get the sample to code to this:
using System;
using System.Collections;
using Microsoft.Win32;

// This class implements a simple dictionary using an array of
DictionaryEntry objects (key/value pairs).
public class IeDictionary: IDictionary
{
// The array of items
private DictionaryEntry[] items;
private Int32 ItemsInUse = 0;

// Construct the IeDictionarywith the desired number of items.
// The number of items cannot change for the life time of this
SimpleDictionary.
public IeDictionary(Int32 numItems)
{
items = new DictionaryEntry[numItems];
}


#region IDictionary Members
public bool IsReadOnly { get { return false; } }
public bool Contains(object key)
{
Int32 index;
return TryGetIndexOfKey(key, out index);
}
public bool IsFixedSize { get { return false; } }
public void Remove(object key)
{
if (key == null) throw new ArgumentNullException("key");
// Try to find the key in the DictionaryEntry array
Int32 index;
if (TryGetIndexOfKey(key, out index))
{
// If the key is found, slide all the items up.
Array.Copy(items, index + 1, items, index, ItemsInUse - index -
1);
ItemsInUse--;
}
else
{
// If the key is not in the dictionary, just return.
}
}
public void Clear() { ItemsInUse = 0; }
public void Add(object key, object value)
{
// Add the new key/value pair even if this key already exists in
the dictionary.
if (ItemsInUse == items.Length)
throw new InvalidOperationException("The dictionary cannot hold
any more items.");
items[ItemsInUse++] = new DictionaryEntry(key, value);
}
public ICollection Keys
{
get
{
// Return an array where each item is a key.
Object[] keys = new Object[ItemsInUse];
for (Int32 n = 0; n < ItemsInUse; n++)
keys[n] = items[n].Key;
return keys;
}
}
public ICollection Values
{
get
{
// Return an array where each item is a value.
Object[] values = new Object[ItemsInUse];
for (Int32 n = 0; n < ItemsInUse; n++)
values[n] = items[n].Value;
return values;
}
}
public object this[object key]
{
get
{
// If this key is in the dictionary, return its value.
Int32 index;
if (TryGetIndexOfKey(key, out index))
{
// The key was found; return its value.
return items[index].Value;
}
else
{
// The key was not found; return null.
return null;
}
}

set
{
// If this key is in the dictionary, change its value.
Int32 index;
if (TryGetIndexOfKey(key, out index))
{
// The key was found; change its value.
items[index].Value = value;
}
else
{
// This key is not in the dictionary; add this key/value
pair.
Add(key, value);
}
}
}
private Boolean TryGetIndexOfKey(Object key, out Int32 index)
{
for (index = 0; index < ItemsInUse; index++)
{
// If the key is found, return true (the index is also
returned).
if (items[index].Key.Equals(key)) return true;
}

// Key not found, return false (index should be ignored by the
caller).
return false;
}
#endregion
}

But I got alot erors. Mostly on those I don't plant to use
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.IDictionary.GetEnumerator()'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.ICollection.CopyTo(System.Array, int)'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.ICollection.Count'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.ICollection.SyncRoot'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.ICollection.IsSynchronized'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.IEnumerable.GetEnumerator()'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
 
G

gg

thanks. I will try Dictionary.
Nicholas Paldino said:
jg,

If you are using VS.NET 2005, why not just use:

Dictionary<object, object>

Or a Hashtable?

As for your compiler errors, the interfaces you are implementing derive
from other interfaces. You have to implement those members as well.

Hope this helps.

--
- Nicholas Paldino [.NET/C# MVP]
- (e-mail address removed)

jg said:
I was trying to get custom dictionary class that can store generic or
string[]; So I started with the example given by the visual studio 2005
c# online help for simpledictionay object

That seem to miss a few things including #endregion directive and the
ending class }

Is there not a simple way like in dotnet vb?

I managed to get the sample to code to this:
using System;
using System.Collections;
using Microsoft.Win32;

// This class implements a simple dictionary using an array of
DictionaryEntry objects (key/value pairs).
public class IeDictionary: IDictionary
{
// The array of items
private DictionaryEntry[] items;
private Int32 ItemsInUse = 0;

// Construct the IeDictionarywith the desired number of items.
// The number of items cannot change for the life time of this
SimpleDictionary.
public IeDictionary(Int32 numItems)
{
items = new DictionaryEntry[numItems];
}


#region IDictionary Members
public bool IsReadOnly { get { return false; } }
public bool Contains(object key)
{
Int32 index;
return TryGetIndexOfKey(key, out index);
}
public bool IsFixedSize { get { return false; } }
public void Remove(object key)
{
if (key == null) throw new ArgumentNullException("key");
// Try to find the key in the DictionaryEntry array
Int32 index;
if (TryGetIndexOfKey(key, out index))
{
// If the key is found, slide all the items up.
Array.Copy(items, index + 1, items, index, ItemsInUse -
index - 1);
ItemsInUse--;
}
else
{
// If the key is not in the dictionary, just return.
}
}
public void Clear() { ItemsInUse = 0; }
public void Add(object key, object value)
{
// Add the new key/value pair even if this key already exists in
the dictionary.
if (ItemsInUse == items.Length)
throw new InvalidOperationException("The dictionary cannot
hold any more items.");
items[ItemsInUse++] = new DictionaryEntry(key, value);
}
public ICollection Keys
{
get
{
// Return an array where each item is a key.
Object[] keys = new Object[ItemsInUse];
for (Int32 n = 0; n < ItemsInUse; n++)
keys[n] = items[n].Key;
return keys;
}
}
public ICollection Values
{
get
{
// Return an array where each item is a value.
Object[] values = new Object[ItemsInUse];
for (Int32 n = 0; n < ItemsInUse; n++)
values[n] = items[n].Value;
return values;
}
}
public object this[object key]
{
get
{
// If this key is in the dictionary, return its value.
Int32 index;
if (TryGetIndexOfKey(key, out index))
{
// The key was found; return its value.
return items[index].Value;
}
else
{
// The key was not found; return null.
return null;
}
}

set
{
// If this key is in the dictionary, change its value.
Int32 index;
if (TryGetIndexOfKey(key, out index))
{
// The key was found; change its value.
items[index].Value = value;
}
else
{
// This key is not in the dictionary; add this key/value
pair.
Add(key, value);
}
}
}
private Boolean TryGetIndexOfKey(Object key, out Int32 index)
{
for (index = 0; index < ItemsInUse; index++)
{
// If the key is found, return true (the index is also
returned).
if (items[index].Key.Equals(key)) return true;
}

// Key not found, return false (index should be ignored by the
caller).
return false;
}
#endregion
}

But I got alot erors. Mostly on those I don't plant to use
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.IDictionary.GetEnumerator()'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.ICollection.CopyTo(System.Array, int)'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.ICollection.Count'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.ICollection.SyncRoot'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.ICollection.IsSynchronized'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
c:\test\IeDictiionary.cs(6,14): error CS0535:
'IeDictionary' does not implement interface member
'System.Collections.IEnumerable.GetEnumerator()'
c:\windows\Microsoft.NET\Framework\v2.0.50215\mscorlib.dll: (Location of
symbol
related to previous error)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top