Solved

vb.net hashtable

Posted on 2006-07-12
17
2,338 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 7
  • 5
  • 2
  • +2
17 Comments
 
LVL 24

Expert Comment

by:Jeff Certain
ID: 17091621
Gotta ask... are you using VS2005?
0
 

Author Comment

by:jackjohnson44
ID: 17091683
yes
0
 
LVL 24

Expert Comment

by:Jeff Certain
ID: 17091836
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
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 34

Accepted Solution

by:
Sancler earned 500 total points
ID: 17091924
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
ID: 17091926
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
ID: 17091949
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
ID: 17092008
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
ID: 17092035
Any chance you have an empty hashtable as the value in that key?
0
 

Author Comment

by:jackjohnson44
ID: 17092064
no,
I can loop through with a nested loop.
0
 

Author Comment

by:jackjohnson44
ID: 17092200
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
ID: 17092263
How are you adding the Hashtable to the outer Hashtable?

Bob
0
 

Author Comment

by:jackjohnson44
ID: 17092266
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
ID: 17092279
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
ID: 17099041
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
ID: 17099215
Lojk... in VS2005 they're called generics :)
0
 
LVL 34

Expert Comment

by:Sancler
ID: 17099525
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
ID: 17100383
@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

Instantly Create Instructional Tutorials

Contextual Guidance at the moment of need helps your employees adopt to new software or processes instantly. Boost knowledge retention and employee engagement step-by-step with one easy solution.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Well, all of us have seen the multiple EXCEL.EXE's in task manager that won't die even if you call the .close, .dispose methods. Try this method to kill any excels in memory. You can copy the kill function to create a check function and replace the …
The ECB site provides FX rates for major currencies since its inception in 1999 in the form of an XML feed. The files have the following format (reducted for brevity) (CODE) There are three files available HERE (http://www.ecb.europa.eu/stats/exch…
Finding and deleting duplicate (picture) files can be a time consuming task. My wife and I, our three kids and their families all share one dilemma: Managing our pictures. Between desktops, laptops, phones, tablets, and cameras; over the last decade…

738 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