views:

3100

answers:

10

I have a property that returns a HashTable. I would like to sort it without refactoring my property. Please note: I do not want to return another type. Code:

    /// <summary>
    /// All content containers.
    /// </summary>
    public Hashtable Containers
    {
        get
        {
            Hashtable tbl = new Hashtable();
            foreach (Control ctrl in Form.Controls)
            {
                if (ctrl is PlaceHolder)
                {
                    tbl.Add(ctrl.ID, ctrl);
                }
                // Also check for user controls with content placeholders.
                else if (ctrl is UserControl)
                {
                    foreach (Control ctrl2 in ctrl.Controls)
                    {
                        if (ctrl2 is PlaceHolder)
                        {
                            tbl.Add(ctrl2.ID, ctrl2);
                        }
                    }
                }
            }

            return tbl;
        }
    }
+2  A: 

Sorry, but you can't sort hashtable. You will have to refactor your code to use some sortable collections.

lubos hasko
+1  A: 

I am quite sure that hash tables cannot be sorted ... ;)

Wikipedia Hash Table

Daniel Brückner
+4  A: 

lubos is right: you can't sort a HashTable. If you could, it wouldn't be a HashTable. You can enumerate the HashTable, and then sort the enumeration. But that would be very slow. Much better to use a SortedDictionary instead.

Joel Coehoorn
A: 

There is no point in sorting a hash table because you already have almost constant lookup time. Or at worst O(B) where B is the bucket size.

Brian R. Bondy
+12  A: 

Hashtables work by mapping keys to values. Implicit in this mapping is the concept that the keys aren't sorted or stored in any particular order.

However, you could take a look at SortedDictionary<K,V>.

John Feminella
Thanks. Works great. I was very easy to reactor property since most of my drop down elements using Key Pair Value
+1  A: 

You will need to return something other than a hash table. I won't reiterate what you claim to understand already, but you need to rethink whatever part of your design requires you to return sorted objects in a hash table.

Peter
+4  A: 

Another option is to construct the hash table as you're already doing, and then simply construct a sorted set from the keys. You can iterate through that sorted key set, fetching the corresponding value from the hash table as needed.

joel.neely
This is exactly how I was able to make it work.
A: 

Of course hash tables can be sorted, but you need to first define what it means to sort a hash table. (Therein lies the issue)

Once you have done that, however, you've invariably removed all the advantages that a hashtable can give you, and you might as well use a sorted array (with binary searching), or use a red-black tree instead.

Arafangion
+1  A: 

Not exactly a C# answer but I am sure you can make something of it.

In Perl it is common to "sort" a hash table for use in output to the display.

For example:

print "Items: ";
foreach (sort keys %items) {
    print $_, '=', $items{$_}, ' ';
}

The trick here is that Perl doesn't sort the hash, it is sorting a copied list of hash keys. It should be easy enough in C# to extract the hash keys into a list and then sort that list.

Zan Lynx
I have done that, by creating SortList object then loop over hashtable values and placed values into SortList and then sortList.Sort()
A: 

System.Collections.sortedList is the best option

sreyes