Solved

vb.net hashtable

Posted on 2006-07-12
17
2,320 Views
Last Modified: 2008-03-10
I have a hashtable of hashtables.

For some reason I can't get to the inner hash table using a key.

        For Each text As String In masterLoadedTests.Keys
            Debug.Print(text)
            Debug.Print(masterLoadedTests.Item(text).ToString)  'this gives me a null reference
        Next

I can doing it through enumeration
        For Each x As Hashtable In masterLoadedTests.Values
            Debug.Print(x.ToString)  'gives me System.Collections.Hashtable
        Next

0
Comment
Question by:jackjohnson44
  • 7
  • 5
  • 2
  • +2
17 Comments
 
LVL 24

Expert Comment

by:Jeff Certain
Comment Utility
Gotta ask... are you using VS2005?
0
 

Author Comment

by:jackjohnson44
Comment Utility
yes
0
 
LVL 24

Expert Comment

by:Jeff Certain
Comment Utility
1. Forget you ever heard of system.collections.... use memebrs of system.Collections.Generic... always :)

2. Replace your hashtables with Dictionary(Of T1, T2) -- where T1 specifies your key type and T2 specifies your value type.

3.
    Dim masterLoadedTests As New System.Collections.Generic.Dictionary(Of String, Dictionary(Of String, String))
    For Each key As String In masterLoadedTests.Keys
      Dim thisDictionary As Dictionary(Of String, String) = masterLoadedTests(key)
      For Each key2 As String In thisDictionary.Keys
        Debug.Print(thisDictionary(key2))
      Next
    Next
  End Sub
0
 
LVL 34

Accepted Solution

by:
Sancler earned 500 total points
Comment Utility
Maybe, but this worked OK for me in VB.NET 2005.  One form, one button

    Dim ht As New Hashtable
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        For Each text As String In ht.Keys
            Debug.WriteLine(text)
            Debug.WriteLine(ht.Item(text).ToString)  'this gives me a null reference
        Next
    End Sub

    Private Sub HashTableForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For i As Integer = 0 To 10
            Dim htt As New Hashtable
            For j As Integer = 0 To 10
                htt.Add("Key" & j.ToString, "Value" & j.ToString)
            Next
            ht.Add("Key" & i.ToString, htt)
        Next
    End Sub

giving "System.Collections.Hashtable" where the comment has 'this gives me a null reference

Roger
0
 

Author Comment

by:jackjohnson44
Comment Utility
I would rather use hash tables.  I have a lot already working off this style.

Is there a difference?

Like I said above, I can enumerate through, I just can't call it explicitly

Debug.Print(masterLoadedTests.Item(text).ToString)  'this gives me a null reference

look at the two examples above, each should work well.
0
 
LVL 24

Expert Comment

by:Jeff Certain
Comment Utility
There's a huge difference.

1. Generics allow you to code faster.
2. Generics are type safe... you can't pass in variables that are of the wrong type.
3. Generics improve performance... you don't box and unbox to type Object.
0
 

Author Comment

by:jackjohnson44
Comment Utility
Why can't I get this to work.
I am not doing anything too crazy here.

        Dim text1 As String = ""
        For Each x As Hashtable In masterLoadedTests.Values
            Debug.Print(x.ToString)   'prints System.Collections.Hashtable which is correct
        Next

        For Each text As String In masterLoadedTests.Keys
            Debug.Print(text)
            Dim x As New Hashtable
            x = masterLoadedTests.Item(text)
            Debug.Print(x.ToString)  'gives me an error
            text1 = text
        Next
0
 
LVL 24

Expert Comment

by:Jeff Certain
Comment Utility
Any chance you have an empty hashtable as the value in that key?
0
Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

 

Author Comment

by:jackjohnson44
Comment Utility
no,
I can loop through with a nested loop.
0
 

Author Comment

by:jackjohnson44
Comment Utility
actually, this won't work

I get this error:
Unable to cast object of type 'System.Collections.DictionaryEntry' to type 'System.Collections.Hashtable'

        For Each x As Hashtable In masterLoadedTests.Values
            Debug.Print(x.ToString)
        Next

        For Each x As Hashtable In masterLoadedTests.Values
            For Each y As Hashtable In x  'I get the error here
                Debug.Print(y.ToString)
            Next
        Next
0
 
LVL 96

Expert Comment

by:Bob Learned
Comment Utility
How are you adding the Hashtable to the outer Hashtable?

Bob
0
 

Author Comment

by:jackjohnson44
Comment Utility
also, this does not work

            masterLoadedTests.Add(selectedTestID, currentTest)

            Debug.Print(selectedTestID.ToString)  'prints a number used as my key
            Debug.Print(currentTest.ToString)      'prints System.Collections.Hashtable
            Debug.Print(masterLoadedTests.Item(currentTest).ToString)  'I get a nullexception reference
0
 

Author Comment

by:jackjohnson44
Comment Utility
sorry about that, typo it did work

error
Unable to cast object of type 'System.Collections.DictionaryEntry' to type 'System.Collections.Hashtable'.
see below

            Debug.Print(selectedTestID.ToString)
            Debug.Print(currentTest.ToString)
            Debug.Print(masterLoadedTests.Item(selectedTestID).ToString)
            For Each x As Hashtable In masterLoadedTests.Values
                For Each y As Hashtable In x   'error on this line
                    Debug.Print(y.ToString)
                Next
            Next
0
 
LVL 9

Expert Comment

by:lojk
Comment Utility
can you not create a strongly typed collection of type hashtable inheriting collectionbase? Ive never tried it for hashtables but in theory you can create a strongly typed collection of any type.
0
 
LVL 24

Expert Comment

by:Jeff Certain
Comment Utility
Lojk... in VS2005 they're called generics :)
0
 
LVL 34

Expert Comment

by:Sancler
Comment Utility
jackjohnson44

Did you try the code I posted earlier?  If so, did it work?

Whilst I understand the points that Chaosian is making about alternatives, I am interested in why what you are doing is not working when code which, so far as I can see is identical in its essentials, is working for me.  So if, but only if, the code that works for me also works for you it may be possible to work from that to identify the difference in the detail of the two approaches which is producing the problem.

Roger
0
 
LVL 9

Expert Comment

by:lojk
Comment Utility
@chaosian
ahh.... picked up the technique in my VB6 days and vs2003 made it even easier to make 'Users' Collections of 'User' defined classes and ive always just gone that way (the MSDN said in vs2003 to inherit from CollectionBase). I will go away and have a look through the MSDN and do some research on Generics and their differences (are they any quicker or less memory hungry?).

Ive never had much reason to use hashtables..Why bother using a hashtable anyway if you can define your types (and collections of types) before you start? Is it a size/memory issue?

(collections of ) Collections of classes (and enums where relevant) let you do...
(where settings is a class of my creation containing various properties and public instances of class collections)

Settings.Users.Add("lojk")
Settings.Users("lojk").Password ="Password"
Settings.Screen.Resolution=enXVGA

which helps to make the inline code so inherently readable, especially if you want to present any of those classes across an assembly boundary or to another developer. What would the equivalent code be using HashTables? The beauty of this is approach is Serialising and Deserialing these collections is simple and provides easily user-modifyable/readable (for example, configuration) files. (never write another 'GetSettings' sub again..)

OK so i know that my comment is a little off-topic (or is it? ;-)) so as for the original question...

Using 'text' as a variable name is not a great idea. isnt text a reserved word? (certainly is in my mind even if it isnt) and in some of the examples that work you 'x as hashtable in values' in some of the ones that dont you seem to use 'text as string in keys' and there doesnt seem to be much consitency..

also shouldnt this block say this?

            Debug.Print(selectedTestID.ToString)
            Debug.Print(currentTest.ToString)
            Debug.Print(masterLoadedTests.Item(selectedTestID).ToString)
            For Each x As Hashtable In masterLoadedTests.Values
                For Each y As Hashtable In x.values '<<<< or dictionaryentry or something else... whatever the enumerator is i suppose.
                    Debug.Print(y.ToString)
                Next
            Next


I dont really know-ive not tested any of the hashtable code on a compiler but i think a Strongly Typed Collection of Classes might be better in many ways.


0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Article by: jpaulino
XML Literals are a great way to handle XML files and the community doesn’t use it as much as it should.  An XML Literal is like a String (http://msdn.microsoft.com/en-us/library/system.string.aspx) Literal, only instead of starting and ending with w…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

8 Experts available now in Live!

Get 1:1 Help Now