Avatar billede Mikker Praktikant
08. juni 2008 - 22:37 Der er 7 kommentarer og
1 løsning

Sortering af HashTable

Kære Eksperter

Hvordan sorterer jeg en HashTable efter value?

Hvis jeg f.eks. har:

Hashtable ht = new Hashtable();
ht["Carsten"] = "Jensen";
ht["Rasmus"] = "Andersen";
ht["Bo"] = "Bentzen";

Det behøver ikke nødvendigvis at være en Hashtable. Det skal bare være et Key/Value array.

Det ville være fedt med et simpelt eksempel :o)
Avatar billede arne_v Ekspert
08. juni 2008 - 22:52 #1
Hvis du har mulighed for at bruge .NET 3.5 kan du lave:

using System;
using System.Linq;
using System.Collections.Generic;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Dictionary<string,string> ht = new Dictionary<string, string>();
            ht["Carsten"] = "Jensen";
            ht["Rasmus"] = "Andersen";
            ht["Bo"] = "Bentzen";
            String[] keys = ht.Keys.ToArray();
            String[] vals = ht.Values.ToArray();
            Array.Sort(keys, vals);
            for(int i = 0; i < ht.Count; i++)
            {
                Console.WriteLine(keys[i] + " -> " + vals[i]);
            }
            Array.Sort(vals, keys);
            for(int i = 0; i < ht.Count; i++)
            {
                Console.WriteLine(keys[i] + " -> " + vals[i]);
            }
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
08. juni 2008 - 23:05 #2
I .NET 1.1 kan du:

using System;
using System.Collections;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Hashtable ht = new Hashtable();
            ht["Carsten"] = "Jensen";
            ht["Rasmus"] = "Andersen";
            ht["Bo"] = "Bentzen";
            ArrayList al = new ArrayList();
            foreach(DictionaryEntry k in ht)
            {
                al.Add(k);
            }
            al.Sort(new KeySort());
            foreach(DictionaryEntry de in al)
            {
                Console.WriteLine(de.Key + " -> " + de.Value);
            }
            al.Sort(new ValSort());
            foreach(DictionaryEntry de in al)
            {
                Console.WriteLine(de.Key + " -> " + de.Value);
            }
            Console.ReadKey();
        }
    }
    public class KeySort : IComparer
    {
        public int Compare(object a, object b)
        {
            return ((string)((DictionaryEntry)a).Key).CompareTo((string)((DictionaryEntry)b).Key);
        }
    }
    public class ValSort : IComparer
    {
        public int Compare(object a, object b)
        {
            return ((string)((DictionaryEntry)a).Value).CompareTo((string)((DictionaryEntry)b).Value);
        }
    }
}
Avatar billede arne_v Ekspert
08. juni 2008 - 23:15 #3
Og er man på 3.5 kan man vel lige så godt lave:

using System;
using System.Linq;
using System.Collections.Generic;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Dictionary<string, string> ht = new Dictionary<string, string>();
            ht["Carsten"] = "Jensen";
            ht["Rasmus"] = "Andersen";
            ht["Bo"] = "Bentzen";
            var q1 = from k in ht.Keys orderby k select new KeyValuePair<string, string>(k, ht[k]);
            foreach(KeyValuePair<string, string> kvp in q1)
            {
                Console.WriteLine(kvp.Key + " -> " + kvp.Value);
            }
            var q2 = from k in ht.Keys orderby ht[k] select new KeyValuePair<string, string>(k, ht[k]);
            foreach(KeyValuePair<string, string> kvp in q2)
            {
                Console.WriteLine(kvp.Key + " -> " + kvp.Value);
            }
            Console.ReadKey();
        }
    }
}
Avatar billede Mikker Praktikant
08. juni 2008 - 23:48 #4
Hej arne_v

Tak for svaret.

Jeg bruger VS2005 og Framework 2.0, og bruger altså dit midterste eksempel. Og det virker jo rigtigt godt - men de der ikke en nemmere måde end at smide entriesne fra HashTablen ind i et ArrayList for at kunne sortere? Findes der f.eks. ikke et Dictionary som kan sortere på value direkte vha. IComparer?

/miclyk
Avatar billede Mikker Praktikant
08. juni 2008 - 23:49 #5
*de* = er
Avatar billede Mikker Praktikant
09. juni 2008 - 00:02 #6
Jeg kan vel egentligt bare udfylde mit ArrayList direkte med DictionaryEntries:

ArrayList myOtherList = new ArrayList();
myOtherList.Add(new DictionaryEntry("Carsten", "Jensen"));
myOtherList.Add(new DictionaryEntry("Rasmus", "Andersen"));
myOtherList.Add(new DictionaryEntry("Bo", "Bentzen"));

Det virker ihvertfald fint :o)

Tak for hjælpen arne_v. Smid et svar.
Avatar billede arne_v Ekspert
09. juni 2008 - 00:21 #7
For 2.0 kan man:

using System;
using System.Collections.Generic;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Dictionary<string,string> ht = new Dictionary<string, string>();
            ht["Carsten"] = "Jensen";
            ht["Rasmus"] = "Andersen";
            ht["Bo"] = "Bentzen";
            List<KeyValuePair<string, string>> al = new List<KeyValuePair<string, string>>();
            foreach(KeyValuePair<string, string> kvp in ht)
            {
                al.Add(kvp);
            }
            al.Sort(delegate(KeyValuePair<string, string> a, KeyValuePair<string, string> b) { return a.Key.CompareTo(b.Key); });
            foreach(KeyValuePair<string, string> kvp in al)
            {
                Console.WriteLine(kvp.Key + " -> " + kvp.Value);
            }
            al.Sort(delegate(KeyValuePair<string, string> a, KeyValuePair<string, string> b) { return a.Value.CompareTo(b.Value); });
            foreach(KeyValuePair<string, string> kvp in al)
            {
                Console.WriteLine(kvp.Key + " -> " + kvp.Value);
            }
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
09. juni 2008 - 00:21 #8
og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB
Seneste spørgsmål Seneste aktivitet
I dag 10:28 PDFEngine Af barth i Andet software
I går 22:40 Butte indhold i celler Af lurup i Excel
I går 15:24 Power Query Af djsimonsen i Excel
I går 14:43 Hvis ikke på liste, tilføj værdier til liste Af TheLibrarian i Excel
I går 11:33 Windows 11 Af ranni i Windows