Solved

vb.net hashtable

Posted on 2006-07-12
17
2,342 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
[Live Webinar] The Cloud Skills Gap

As Cloud technologies come of age, business leaders grapple with the impact it has on their team's skills and the gap associated with the use of a cloud platform.

Join experts from 451 Research and Concerto Cloud Services on July 27th where we will examine fact and fiction.

 
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

Revamp Your Training Process

Drastically shorten your training time with WalkMe's advanced online training solution that Guides your trainees to action.

Question has a verified solution.

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

This tutorial demonstrates one way to create an application that runs without any Forms but still has a GUI presence via an Icon in the System Tray. The magic lies in Inheriting from the ApplicationContext Class and passing that to Application.Ru…
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 we outline the Physical Segments view of NetCrunch network monitor. By following this brief how-to video, you will be able to learn how NetCrunch visualizes your network, how granular is the information collected, as well as where to f…
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…

617 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