I have always seen developers (including myself) having difficulty in sorting a HashTable based on keys or values. I thought of writing this article which may help to resolve issues regarding HashTable sorting.
Before moving forward, we need to understand that it is not possible to sort a Hashtable since the data is stored by the hashcode of the key, not by the index .
So to sort the data of a Hashtable, we need to have a sortable object like an array or an ArrayList.
To achieve this, first of all let's be clear about our requirement on following terms
- Sorting has to be done on Key or Value.
- Sorting order
Once we are clear about these requirements, now we can proceed.
In my example, I will take that I have to sort my Hashtable on the basis of key in a order that say I have the following data:
April 08
March 08
Feb 08
.....
My final sorted order should be
April 08
March 08
Feb 08
My Hashtable has these months as keys and there is value which is associated with each of these keys that is a bonus.These key - value pair has to be displayed in a table in above said sorting order.
I will make an assumption here that my Hashtable is populated with correct values.
For Sorting this HashTable, I need to follow following listed steps in proper order:-
- First of all Create a method which take a Hashtable as a parameter.
e.g .:-
public void BuildTable(Hashtable myHashTable)
{
}
- Second step is to create an array. Here you have to decide certain things. If you want to sort your Hashtable on the basis of key, then create an array of that type else on the basis of value.
In my case it is key and that too of datetime type. So I will first create a array of datetime.
e.g.
// Get the count of ahshtable
int k = myHashTable.count;
// Create a array of correct type with correct length
DateTime[] datesortedvalue = new DateTime[k];
// Populate the array with correct keys.
int i = 0;
foreach (DictionaryEntry de in myHashTable)
{
datesortedvalue[i] = parseMonth(de.Key.ToString());
i++;
}
Note if the criteria is Value and not Key, then use de.Value.ToString();
-
Next step is to sort this array which is easily achievable as done in following code snippet by calling the Sort and Reverse methods of the Array object.
Array.Sort(datesortedvalue);
Array.Reverse(datesortedvalue);
-
Next step is to display in table as was in my requirement. So basically I have to display it on the basis of Key and challenge was to fetch the correct value according to key. So I will do something like :-
// Loop through all elements of Array
for (int j = 0; j < k; j++)
{
//Display Key Value which is in Sorted Array as follows:-
dataRow.Cells[0].Text = DeparseTostring(datesortedvalue[j]);
// Display the correct Value in accordance with Key :-
foreach (DictionaryEntry de in hsHistory)
{
if ((de.Key.ToString() == DeparseTostring(datesortedvalue[j]))
{
dataRow.Cells[1].Text = de.Value.ToString();
}
}
}
Note that in above example, I have created two methods parseMonth and DeparseTostring for converting string into month and vice-versa.
So after following above 4 steps we can sort an hashtable easily. Hope this helps everyone.