Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

vb.net hashtable

Posted on 2006-07-12
17
Medium Priority
?
2,344 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
Industry Leaders: 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 2000 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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

This article explains how to create and use a custom WaterMark textbox class.  The custom WaterMark textbox class allows you to set the WaterMark Background Color and WaterMark text at design time.   IMAGE OF WATERMARKS STEPS Create VB …
Creating an analog clock UserControl seems fairly straight forward.  It is, after all, essentially just a circle with several lines in it!  Two common approaches for rendering an analog clock typically involve either manually calculating points with…
In this video, Percona Solution Engineer Rick Golba discuss how (and why) you implement high availability in a database environment. To discuss how Percona Consulting can help with your design and architecture needs for your database and infrastr…
Want to learn how to record your desktop screen without having to use an outside camera. Click on this video and learn how to use the cool google extension called "Screencastify"! Step 1: Open a new google tab Step 2: Go to the left hand upper corn…

670 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