working with KeyCollection

Hi,

I'm trying to figure out this dictionary keyCollection stuff.  All I want is to get a list of all the keys of a dictionary, which is defined as:

private baseDictionary As Dictionary(Of String, Dictionary(Of String, BasicContainer))

where BasicContainer is a small class.  What I don't understand is why baseDictionary.Keys() returns something called a KeyCollection instead of a simple list of string?  What's the purpose of that?  If I have Dictionary(Of String, Tvalue), then does it really matter what Tvalue is?  It could be a million different things, but the keys would all still be string. What is the point of this KeyCollection?

This definition of a strongly type KeyCollection makes no sense to me.  How can I get a simple List(OF String) or ArrayList or some basic, sensible collection of strings that represent the dictionary keys?

Thanks!
LVL 11
ugebAsked:
Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

x
 
Bob LearnedConnect With a Mentor Commented:
Hmmm...another possibility, that I haven't thought about in a long time:

Dictionary.KeyCollection.CopyTo Method
http://msdn.microsoft.com/en-us/library/91e2z0hz(v=vs.85).aspx

string[] keys = new string[dictionary.Keys.Count];
dictionary.Keys.CopyTo(keys, 0);

Open in new window

0
 
Bob LearnedCommented:
Try using the ToList extension method:

Dim list As New Dictionary(Of String, Integer)() From { 
	{"John", 1}, 
	{"Dave", 2}, 
	{"Greg", 3} 
}

Dim keys = list.Keys.ToList()

Dim text = String.Join(",", keys.ToArray())

Console.WriteLine(text)

Open in new window

0
 
ugebAuthor Commented:
Maybe it's the version of vb.net, but I don't have a ToList method in my dictionaries.  I'm bound to vb.net 3.0.
0
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

 
Bob LearnedCommented:
I overlooked a little of the magic code that made that work:

using System.Linq;

Without that imports at the top of the code module, ToList will not work, since it is provided by that namespace.  I believe that 3.0 has the LINQ extensions.  You will need to check that, and let me know if I am correct.
0
 
ugebAuthor Commented:
It looks like 3.0 doesn't have linq as I get an error on the using statement. There's a ToArray method available, but in any case it looks like I may just have to continue brute force conversion.
0
 
Bob LearnedCommented:
That method was introduced in 3.5.  It might be better to use 3.5, rather than 3.0, but that might introduce some breaking changes.
0
 
ugebAuthor Commented:
Unfortunately I'm using a critical library (NDde) that was written for .net 2.0.  I've managed to get .net 3.0, but no further, so 3.5 won't work.
0
 
Bob LearnedCommented:
Then, I believe that you will need to use a for loop:

For Each key As String In baseContainer.Keys
0
 
ugebAuthor Commented:
Yes, that was the obvious way and it's what I'm currently doing, but it feels like a big hack and it's slower, uglier, less elegant and less efficient and than a native procedure. That's why I wanted to change.  I was using this method before I even asked the question, but I really wanted to know if there was a better way.
0
 
ugebAuthor Commented:
I didn't even see that you had posted this response until now.  I don't have time to check it out now, but I do see it works in .net 3, so it looks hopeful.  Thanks.
0
All Courses

From novice to tech pro — start learning today.