Link to home
Start Free TrialLog in
Avatar of ugeb
ugebFlag for United States of America

asked on

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!
Avatar of Bob Learned
Bob Learned
Flag of United States of America image

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

Avatar of ugeb

ASKER

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.
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.
Avatar of ugeb

ASKER

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.
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.
Avatar of ugeb

ASKER

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.
Then, I believe that you will need to use a for loop:

For Each key As String In baseContainer.Keys
Avatar of ugeb

ASKER

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.
ASKER CERTIFIED SOLUTION
Avatar of Bob Learned
Bob Learned
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of ugeb

ASKER

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.