Avatar billede eonix Nybegynder
05. maj 2007 - 08:38 Der er 8 kommentarer og
1 løsning

ArrayList.Sort() laver vrøvl!

Hej folkens,

Hvorfor er det lige at min ArrayList VIL placere A forkert på en sorteret liste???

Se lige eksemplet her:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace ArrayList_Exempel
{
    public partial class Form1 : Form
    {
        ArrayList liste = new ArrayList();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            liste.Add("DDD"); // Smider nogle objekter ind :)
            liste.Add("AAA");
            liste.Add("EEE");
            liste.Add("BBB");
            liste.Add("CCC");
            liste.Add("XXX");
            liste.Sort(); // Sorterer listen
            for (int i = 0; i < liste.Count; i++)
            {
                listBox1.Items.Add(liste[i]); // Placerer de sorterede elementer i listboxen
            }
        }
    }
}

Problemet her er at resultatet bliver det her:

BBB
CCC
DDD
EEE
XXX
AAA  <-- Hvad fanden laver den i bunden af listen ?

Håber der er nogen der kan forklarer mig hvorfor - og måske komme med en løsning så AAA rent faktisk fremkommer øverst - som det vel burde her!

Venlig hilsen

//EoniX
Avatar billede erikjacobsen Ekspert
05. maj 2007 - 08:45 #1
AA er jo et gammelt dansk Å, som jo skal stå nederst ;)
Avatar billede erikjacobsen Ekspert
05. maj 2007 - 08:47 #2
Læs om problemet, og mere om ArrayList.Sort:
http://www.codeproject.com/cs/algorithms/Beginners_Sort.asp
Avatar billede eonix Nybegynder
05. maj 2007 - 08:50 #3
Åhh - baah hvor lamt - så handler det vel om noget localizing eller sådan noget.. checker dit link!
Avatar billede eonix Nybegynder
05. maj 2007 - 08:56 #4
"If you try the 'Intl. Text 1', you will (depending on your language) usually not see any difference between 'invariant', 'local PC', and 'en-US'. Only the 'da-DK' will bring a difference."

Damnit! man :P - kun danmark der har fucked op på det her :P
Avatar billede erikjacobsen Ekspert
05. maj 2007 - 09:04 #5
Nej, MS har jo et verdensomspændende marked, så de skal tage hensyn til alle. Men du kan jo kode dig ud af det, som artiklen siger. Her bruger jeg "InvariantCulture" - jeg tror den virker, men er ikke sikker på om der er en anden. Du skal lave en klasse:

private class MinSort : IComparer {
  int IComparer.Compare(object x, object y) {
    string src = x.ToString();
    string trg = y.ToString();
    int result = string.Compare(src, trg, true,CultureInfo.InvariantCulture);
    return result;
  }
}

Og kalde din Sort:

liste.Sort(new MinSort());
Avatar billede erikjacobsen Ekspert
05. maj 2007 - 09:05 #6
"true" betyder "ignorecase". Skal der være forskel på store og små bogstaver, så laver du bare en "false".
Avatar billede eonix Nybegynder
05. maj 2007 - 09:10 #7
Fungerende Løsning:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Globalization;

namespace ArrayList_Exempel
{
    public partial class Form1 : Form
    {
        ArrayList liste = new ArrayList();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            liste.Add("DDD");
            liste.Add("AAA");
            liste.Add("EEE");
            liste.Add("BBB");
            liste.Add("CCC");
            liste.Add("XXX");
            liste.Sort(new MinSort());
            for (int i = 0; i < liste.Count; i++)
            {
                listBox1.Items.Add(liste[i]);
            }
        }
    }
    public class MinSort : IComparer
    {
        int IComparer.Compare(object x, object y)
        {
            string src = x.ToString();
            string trg = y.ToString();
            int result = string.Compare(src, trg, true, CultureInfo.InvariantCulture);
            return result;
        }
    }
}

Mange mange tak :) - nu er min AA kommet i toppen :)

Vær flink at smide et svar
Avatar billede erikjacobsen Ekspert
05. maj 2007 - 09:45 #8
Jeg samler slet ikke på point, tak.
Avatar billede eonix Nybegynder
05. maj 2007 - 09:51 #9
hmm ok :) - rigtigt mange tak for hjælpen så erik :) - super god support :)

Ha' det rigtigt godt :)
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