Avatar billede iluka Nybegynder
18. august 2005 - 13:22 Der er 9 kommentarer

problemer med IComparable og Array.Sort

Hej folkens

Jeg får nogle underligt sorterede lister ud af nedenstående kode.

before
aaa
bbb
ccc
aaa
bbb

after
bbb
bbb
ccc
aaa
aaa

hvad går galt?

using System;

class Sandbox
{

    public Sandbox()
    {
        MyCompare[] blah = new MyCompare[5];
        blah[0] = new MyCompare("aaa");
        blah[1] = new MyCompare("bbb");
        blah[2] = new MyCompare("ccc");
        blah[3] = new MyCompare("aaa");
        blah[4] = new MyCompare("bbb");
        Console.WriteLine("before");
        foreach (MyCompare mp in blah)
        {
            Console.WriteLine(mp.myvar);
        }
        Array.Sort(blah);
        Console.WriteLine("after");
        foreach (MyCompare mp in blah)
        {
            Console.WriteLine(mp.myvar);
        }
    }

    public static void Main()
    {
        new Sandbox();
    }


    private class MyCompare : IComparable
    {
        public String myvar;

        public MyCompare(string myvar)
        {
            this.myvar = myvar;
        }

        public int CompareTo(object obj)
        {
            if (obj is MyCompare)
            {
                MyCompare temp = (MyCompare)obj;
                return this.myvar.CompareTo(temp.myvar);
            }
            else
            {
                throw new ArgumentException("object er ikke MyCompare");
            }
        }
    }
}
Avatar billede erikjacobsen Ekspert
18. august 2005 - 13:32 #1
Den opfatter "aa" som et "å", og sætter den sidste. Visse systemer vil bare være "bedrevidende" *g*
Avatar billede anadan Nybegynder
18. august 2005 - 14:19 #2
erikjacobsen har ret. Problemet er at du arbejder med et dansk system. Løsningen er at ændre din CultureInfo til engelsk:

public int CompareTo(object obj)
{
if (obj is MyCompare)
{
MyCompare temp = (MyCompare)obj;
return string.Compare(this.myvar, temp.myvar, false, new System.Globalization.CultureInfo("en"));
}
else
{
throw new ArgumentException("object er ikke MyCompare");
}
}
Avatar billede anadan Nybegynder
18. august 2005 - 14:19 #3
Avatar billede anadan Nybegynder
18. august 2005 - 14:21 #4
Fra siden :

The CultureInfo class holds culture-specific information, such as the associated language, sublanguage, country/region, calendar, and cultural conventions. This class also provides access to culture-specific instances of DateTimeFormatInfo, NumberFormatInfo, CompareInfo, and TextInfo. These objects contain the information required for culture-specific operations, such as casing, formatting dates and numbers, and comparing strings.

The String class indirectly uses this class to obtain information about the default culture.
Avatar billede anadan Nybegynder
18. august 2005 - 14:23 #5
Hvis jeg bruger følgende linie på min computer :

Console.WriteLine(System.Globalization.CultureInfo.CurrentCulture);

får jeg resultatet : "da-DK"
Avatar billede arne_v Ekspert
18. august 2005 - 14:24 #6
en anden mulighed er at bruge .CompareOrdinal fremfor .Compare - den sorterer strengt
byte værdi mæssigt
Avatar billede iluka Nybegynder
18. august 2005 - 14:30 #7
tak for kommentarerne gutter... må nok indrømme at arnes løsning er kønnest. Smid et svar og du får points.

Forresten er det her første gang jeg er blevet rigtigt sur på .net framework... Hvad bilder de sig ind? Jeg mener absolut ikke "å" så havde jeg skrevet "å" ffs!
Avatar billede arne_v Ekspert
18. august 2005 - 15:01 #8
kønnest ved jeg ikke

en sortering som programmører forventer det måske

og svar

og CultureInfo er også et rigtigt svar
Avatar billede arne_v Ekspert
29. september 2005 - 20:53 #9
så mangler du bare at acceptere svaret
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