Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / .NET Framework / New Users / October 2004

Tip: Looking for answers? Try searching our database.

*URGENT Comparing objects stored in hashtable/collection

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Alex - 13 Oct 2004 15:01 GMT
Hi! I need to compare objects that I store in HashTable by using Add method
and passing object as first param, and a unique key string as second.  Later
on I iterate through this collection and need to compare the object stored in
the HashTable to another object that's obtained as one of the params in a
call to an event.
Example code (i'm skipping most declarations to avoid long post):
Private Shared Sub OnChanged(ByVal source As Object, ByVal e As
FileSystemEventArgs)
Dim fsw as FileSystemWatcher
fsw = source
myEnumerator = hshtable.GetEnumerator()
While myEnumerator.MoveNext

    if myEnumerator.Value Is fsw then
       'do something if the object is the same
    end if

End While

I also tried using myEnumerator.Current when performing comparison, as well
as trying to cast the .Value and .Current to the same type of object that I
compare it to (FileSystemWatcher).  I'm open to any suggestions.  The basic
goal of what I'm doing is to store a reference to an object and an associated
string somewhere so that I can later when the event of FileSystemObject fires
identify that object and associated string to perform some relevant action.  
I have a pretty short Deadline on this so any help would be appreciated!

Thanks!
Jeff Gaines - 13 Oct 2004 15:24 GMT
> Hi! I need to compare objects that I store in HashTable by using Add
> method and passing object as first param, and a unique key string as
> second.  Later on I iterate through this collection and need to
> compare the object stored in the HashTable to another object that's
> obtained as one of the params in a call to an event.
> Example code (i'm skipping most declarations to avoid long post):

[snip]

> I also tried using myEnumerator.Current when performing comparison,
> as well as trying to cast the .Value and .Current to the same type of
[quoted text clipped - 6 lines]
>
> Thanks!

Can you cast objects in VB.NET?

In C# I would use:

// Get corresponding TreeNode object
TreeNode tn = (TreeNode)hashTable[currentHandle];

Where the HashTable contains pairs of TreeNodes/TreeNode handles.

There must be something similaer in VB, perhaps
hashTable[currentHandle] as TreeNode?

Signature

Jeff Gaines Damerham Hampshire UK

Alex - 13 Oct 2004 15:35 GMT
Thanks for suggestion Jeff, but as I mentioned in my initial post I have
tried that approach. I might have gone wrong about doing though, so any
suggestions as to how to do it the right way would be great.  VB.net has
CType function that allows you to do the casting/converting between types, so
I tried using it by saying
CType(ojbect1, FileSystemWatcher) and then comparing it to the source object
that already suppose to be of that type. I've also tried casting the source
object to the same type, but VB throws exceptions not liking one of those
particualar conversions.

> > Hi! I need to compare objects that I store in HashTable by using Add
> > method and passing object as first param, and a unique key string as
[quoted text clipped - 27 lines]
> There must be something similaer in VB, perhaps
> hashTable[currentHandle] as TreeNode?
?tefan ?imek - 14 Oct 2004 08:09 GMT
What exactly is in the hashtable?

If you want to map a string to the FileSystemWatcher, then you should use
the fsw's as keys and strings as values. And if you are doing so, simply
casting the return value of the hshtable[fsw] call to string should be
enough. So I guess your code should be:

Private Shared Sub OnChanged(ByVal source As Object, ByVal e As
FileSystemEventArgs)
Dim fsw as FileSystemWatcher
Dim val as String
fsw = source
val = hshtable[fsw]

'if the val isn't Nothing, you've got what you need.

HTH,
Stefan

> Thanks for suggestion Jeff, but as I mentioned in my initial post I have
> tried that approach. I might have gone wrong about doing though, so any
[quoted text clipped - 40 lines]
>> There must be something similaer in VB, perhaps
>> hashTable[currentHandle] as TreeNode?
Alex - 14 Oct 2004 14:43 GMT
Stefan, I don't think you fully understand what I'm doing thus far and why I
am having the problem. Hashtable (in case you don't know) is a collection of
sorts where you can store associated pairs of objects(anything, strings,
numbers, objects,etc...) and keys (strings) that identify them. You can then
use various methods of HashTable class to walk through the list of items you
have stored in it and return the objects you stored and the associated keys,
or use the key to locate a specific object.
My problem is that I cannot use the key to search for the object I need, I
need to compare the object stored in the HashTable to the object that's being
passed to the OnChanged event of the FileWatcher that fires at a particular
time.  Once I am able to establish which specific object stored in the
HashTable is the one that's currently reaising it's event, I can get the
associated Key that I stored in HashTable to perform further actions in the
database.  I hope you or anyone else will have some suggestions either to
improve this method or to do it some other way to achieve end result.

"©tefan ©imek" wrote:

> What exactly is in the hashtable?
>
[quoted text clipped - 59 lines]
> >> There must be something similaer in VB, perhaps
> >> hashTable[currentHandle] as TreeNode?
Jon Skeet [C# MVP] - 14 Oct 2004 15:13 GMT
> Stefan, I don't think you fully understand what I'm doing thus far and why I
> am having the problem. Hashtable (in case you don't know) is a collection of
> sorts where you can store associated pairs of objects(anything, strings,
> numbers, objects,etc...) and keys (strings) that identify them.

Um, hashtable keys don't have to be strings. Indeed, if (as per your
first post) you're calling Add and passing an object as the first
parameter and a string as the second parameter, then that object is the
key, and the string is the value - so no wonder the value is never the
FileSystemWatcher you're interested in.

Signature

Jon Skeet - <skeet@pobox.com>
http://www.pobox.com/~skeet
If replying to the group, please do not mail me too

Alex - 14 Oct 2004 16:15 GMT
Heh! That sure explains a lot :)
Thanks for pointing out my obvious mistake, I'll try the same code I had,
but will take into account the sequence of params now.  I hope this will work
(i know it would defenetly not work the way it's written now). I'll let you
know where I get witht this, but thanks again... sometimes you need a fresh
eye/person to find something as simple as this.

> > Stefan, I don't think you fully understand what I'm doing thus far and why I
> > am having the problem. Hashtable (in case you don't know) is a collection of
[quoted text clipped - 6 lines]
> key, and the string is the value - so no wonder the value is never the
> FileSystemWatcher you're interested in.
Jeff Gaines - 14 Oct 2004 18:48 GMT
> Heh! That sure explains a lot :)
> Thanks for pointing out my obvious mistake, I'll try the same code I
[quoted text clipped - 3 lines]
> again... sometimes you need a fresh eye/person to find something as
> simple as this.

[snip]

Alex

Don't forget you don't need to iterate through the Hashtable - my C#
example and tefan's VB example shows how to read it directly. Will save
some time :-)

Signature

Jeff Gaines Damerham Hampshire UK

Alex - 14 Oct 2004 22:37 GMT
Hi Jeff! Great news, the bloody thing is working finally.  Although there as
some confusion after I set all the sequenses right, the actual comparison of
the objects had to be debugged a couple of times since it's very missleading
the way hashtable works.  I assumed that by comparing the .Value or .Current
property of the HT object to the current fired FSW object I'd see the
results, but apparently the actual object is stored in .Key property, which
is the confusing part since I though it would return the Key I stored for
that particular object.  But at the end it all came down to comparing the
.Key property to the instance that raised the event, and by getting the
actual key i stored using the .Value property.  I'll take a look at the
suggestion about not using the iteration and just finding the correct object
as you said, but I'm not sure that you can access the actual .Value and .Key
property of whatever you find with the method you mentioned.  Also, any
suggesions on how the best way either dispose of this filewatchers once they
are processed (don't want them sitting in memory) or re-use them by pooling
them somehow (with threading?). Thanks again!

Cheers

> > Heh! That sure explains a lot :)
> > Thanks for pointing out my obvious mistake, I'll try the same code I
[quoted text clipped - 11 lines]
> example and tefan's VB example shows how to read it directly. Will save
> some time :-)
Jon Skeet [C# MVP] - 14 Oct 2004 23:05 GMT
> Hi Jeff! Great news, the bloody thing is working finally.  Although there as
> some confusion after I set all the sequenses right, the actual comparison of
[quoted text clipped - 4 lines]
> is the confusing part since I though it would return the Key I stored for
> that particular object.

Hashtable itself doesn't have either Current or Value properties. Are
you talking about IDictionaryEntry or something similar?

If so, I suspect it's a case of getting things the wrong way round
again. I've never seen keys and values getting swapped round as you're
describing.

> But at the end it all came down to comparing the .Key property to the
> instance that raised the event, and by getting the actual key i
> stored using the .Value property. I'll take a look at the suggestion
> about not using the iteration and just finding the correct object as
> you said, but I'm not sure that you can access the actual .Value and
> .Key property of whatever you find with the method you mentioned.

The method Jeff was suggesting is fetching the value using the key -
it's the normal way of accessing a hsahtable. You need to be very clear
on which is the key and which is the value though - this seems to be
the cause of much of the problem.

Signature

Jon Skeet - <skeet@pobox.com>
http://www.pobox.com/~skeet
If replying to the group, please do not mail me too

Alex - 15 Oct 2004 15:05 GMT
Hi Jon!  To answer your question, I use the IDictionaryEnumerator to get
those values to walk through the hashtable.  I think I got a handle on the
whole key/value issue, and will try to use this method to identify the
necessary object without scrolling through all entries.  I do need some
suggestions in regard to properly releasing the FSW objects from memory once
they are fired and actions performed in their OnChanged event.  I'm thinking
of first removing their instance from the hashtable, and then calling the
dispose method.  I don't think that will remove them from memory though, I
belive the GC will do that later one.

Thanks again!

> > Hi Jeff! Great news, the bloody thing is working finally.  Although there as
> > some confusion after I set all the sequenses right, the actual comparison of
[quoted text clipped - 23 lines]
> on which is the key and which is the value though - this seems to be
> the cause of much of the problem.
Jon Skeet [C# MVP] - 15 Oct 2004 15:46 GMT
> Hi Jon!  To answer your question, I use the IDictionaryEnumerator to get
> those values to walk through the hashtable.  I think I got a handle on the
> whole key/value issue, and will try to use this method to identify the
> necessary object without scrolling through all entries.

Good.

> I do need some
> suggestions in regard to properly releasing the FSW objects from memory once
> they are fired and actions performed in their OnChanged event.  I'm thinking
> of first removing their instance from the hashtable, and then calling the
> dispose method.  I don't think that will remove them from memory though, I
> belive the GC will do that later one.

That sounds right to me, yes.

Signature

Jon Skeet - <skeet@pobox.com>
http://www.pobox.com/~skeet
If replying to the group, please do not mail me too

Stefan Simek - 15 Oct 2004 12:59 GMT
See inline:

> Stefan, I don't think you fully understand what I'm doing thus far and why
> I
[quoted text clipped - 8 lines]
> keys,
> or use the key to locate a specific object.

Except that using a hashtable just to walk through it is something like
using a DataTable to store integeres from 20 to 1 and retrieve them by index
;)

And no, the keys are not strings. Hashtable is a generic object to object
dictionary, so you just might use the FSW's as keys, and your related
strings as values.

And if my example hasn't been clear enough, I'm sorry, 'cause I don't use
VB.NET, though I usually can read and understand it.

> My problem is that I cannot use the key to search for the object I need, I
> need to compare the object stored in the HashTable to the object that's
[quoted text clipped - 7 lines]
> database.  I hope you or anyone else will have some suggestions either to
> improve this method or to do it some other way to achieve end result.

And I hope someone will persuade you not to iterate over the hashtable.
Doing so is usefull only if you really need to do something with EVERY
key/value pair, like serializing, etc. The primary function of hashtable is
to lookup a value by it's key, through it's indexer (or Item property, don't
know how it's called in VB).

HTH,
Stefan

> "Ctefan Cimek" wrote:
>
[quoted text clipped - 67 lines]
>> >> There must be something similaer in VB, perhaps
>> >> hashTable[currentHandle] as TreeNode?

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.