Avatar billede testpilot_dk Nybegynder
14. juni 2006 - 10:11 Der er 8 kommentarer og
1 løsning

Arraylist.Sort + AA

Hej!

Jeg sidder og skal sortere nogle data som ligger i en ArrayList!

Nu er jeg så stødt på et spøjst problem, når jeg benytter metoden Sort() så ryger mine poster hvor AA er de første forskellige bogstaver i bunden af min ArrayList. nedenfor er vist et eksempel

Start Data
            ArrayList myAL = new ArrayList();
            myAL.Add("1");
            myAL.Add( "BBVC" );
            myAL.Add("1");
            myAL.Add( "BASD" );
            myAL.Add("1");
            myAL.Add( "BROWN" );
            myAL.Add("1");
            myAL.Add( "Casf" );
            myAL.Add( "DfklospD" );
            myAL.Add( "EFDS" );
            myAL.Add( "AAFDF" );
            myAL.Add( "SDFSD" );
            myAL.Add( "Bdfdsf" );

Slut Data
    [0]    "1"    string
    [1]    "1"    string
    [2]    "1"    string
    [3]    "1"    string
    [4]    "BASD"    string
    [5]    "BBVC"    string
    [6]    "Bdfdsf"    string
    [7]    "BROWN"    string
    [8]    "Casf"    string
    [9]    "DfklospD"    string
    [10]    "EFDS"    string
    [11]    "SDFSD"    string
    [12]    "AAFDF"    string

Nogen som kan forklarer hvorfor og hvordan jeg undgår det
Avatar billede spif2001 Nybegynder
14. juni 2006 - 10:15 #1
Tror det er noget OS sprog halløjsa. Du kører DK og så leger den at AA = Å.

Men få en bedre ekspert på området til at give dig en løsning ;)
Avatar billede md_craig Nybegynder
14. juni 2006 - 10:35 #2
Jeps... det er din culture... her er et eks der tager engelsk:

            List<string> myAL = new List<string>();
            myAL.Add("1");
            myAL.Add("BBVC");
            myAL.Add("1");
            myAL.Add("BASD");
            myAL.Add("1");
            myAL.Add("BROWN");
            myAL.Add("1");
            myAL.Add("Casf");
            myAL.Add("DfklospD");
            myAL.Add("EFDS");
            myAL.Add("AFDF");
            myAL.Add("AA");
            myAL.Add("SDFSD");
            myAL.Add("Bdfdsf");

            string[] tmp = myAL.ToArray();
            StringComparer sc = StringComparer.Create(System.Globalization.CultureInfo.GetCultureInfo("en"), false);

            Array.Sort(tmp,sc);

            foreach (string s in tmp)
                Console.WriteLine(s);
Avatar billede md_craig Nybegynder
14. juni 2006 - 10:38 #3
Og et med Arraylist.Sort istedet:

            ArrayList myAL = new ArrayList();
            myAL.Add("1");
            myAL.Add("BBVC");
            myAL.Add("1");
            myAL.Add("BASD");
            myAL.Add("1");
            myAL.Add("BROWN");
            myAL.Add("1");
            myAL.Add("Casf");
            myAL.Add("DfklospD");
            myAL.Add("EFDS");
            myAL.Add("AFDF");
            myAL.Add("AA");
            myAL.Add("SDFSD");
            myAL.Add("Bdfdsf");

            StringComparer sc = StringComparer.Create(System.Globalization.CultureInfo.GetCultureInfo("en"), false);
            myAL.Sort(sc);

            foreach (object o in myAL)
                Console.WriteLine(o);
Avatar billede md_craig Nybegynder
14. juni 2006 - 10:45 #4
Hvis du ikke kan finde en culture der så passer 100% til den forn for sortering du skal bruge kan du jo implementere din egen Comparer.

Husk på at en StringComparer forventer en string og kaster en "InvalidCastOp...." hvis du smider andet i din AL... men hvis du arbejder på .NET 1.1 så har du ofc. ikke meget andet valg... ellers kunne jeg godt anbefale:

List<string> myAL = new List<string>();
...
StringComparer sc = StringComparer.Create(System.Globalization.CultureInfo.GetCultureInfo("en"), false);
myAL.Sort(sc);
Avatar billede bitsch Nybegynder
14. juni 2006 - 10:57 #5
Bemærk at du i det pågældende scenarie kan anvende InvariantCulture.

StringComparer stringComparer = StringComparer.Create(CultureInfo.InvariantCulture, true);

list.Sort(stringComparer);
Avatar billede bitsch Nybegynder
14. juni 2006 - 11:00 #6
Men uanset om du anvender Culture "En" eller InvariantCulture får du problemer med almindelige ÆØÅ hvis du har disse i dine data.
Avatar billede md_craig Nybegynder
14. juni 2006 - 11:57 #7
Ja det er sandt, og så er alternativet sin egen comparer klasse...
Her er en lille start på en som måske kan sætte dig igang...

    public class DKStringComparer : IComparer
    {
        #region IComparer Members

        public int Compare(object x, object y)
        {
            string sx = (string)x;
            string sy = (string)y;

            if (sx[0] < sy[0])
                return -1;
            else if (sx[0] > sy[0])
                return 1;
            else
                return 0;           
        }

        #endregion
    }

som anvendes :

            DKStringComparer dksc = new DKStringComparer();
            myAL.Sort(dksc);


MEN!!! det er kun en start for dig, som desuden sortere således at:
Å
Æ
Ø
...

Dette finder du forklaringen på her:
http://www.microsoft.com/OpenType/unicode/unicodecp.htm
> http://www.microsoft.com/typography/unicode/1252.gif

Hvor du kan se at Å ligger før Æ og Ø i tabellen...
Desuden kigger den comparer kun på første char, og kigger ikke på om strængen er tom, dette vil resultere i en fejl...

Alle disse ting skal implementeres, men det kan du jo kigge på...

Det der er vigtigt er at hvis:
X er mindre end Y returnere du -1
Y er mindre end X returnere du +1
X er det samme som Y returnere du 0

Den sidste er YDERST vigtig da dette fs SKAL!!! returnere 0, ellers acceptere den ikke comparen

string s = "Peter";
Compare(s,s);
Avatar billede testpilot_dk Nybegynder
14. juni 2006 - 12:41 #8
send et svar mc_graig
Avatar billede md_craig Nybegynder
14. juni 2006 - 14:16 #9
ok
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