Avatar billede c-sharp Nybegynder
22. oktober 2008 - 08:28 Der er 7 kommentarer og
1 løsning

Datatable. sorter string felt numerisk

Jeg har et string felt i min datatable som jeg ønsker at sortere numerisk, hvordan kan man det?

eks:

"1000 bla"
"20  bla bla"
"300  bla bla bla"

det skulle gerne se ud som følger:

"20  bla bla"
"300  bla bla bla"
"1000 bla"


Hvodan kan det lade sig gøre?
Avatar billede aaberg Nybegynder
22. oktober 2008 - 08:45 #1
Hvis vi går ud fra at din kolonne hedder "tekst", så bør følgende virke:

select tekst
from tabel
order by cast(substring(tekst, 0, charindex(' ', tekst)) as int)
Avatar billede c-sharp Nybegynder
22. oktober 2008 - 08:54 #2
Hej aaberg cc og tak for din kommentar!
Jeg skal lave en sortering i en datatable ikke i fobindele med et database kald.
Avatar billede aaberg Nybegynder
22. oktober 2008 - 10:28 #3
Jeg misforstod lige spørgsmålet :-)

Desværre, tror jeg ikke det kan lade sig gøre at sortere en DataTable på denne måde. Du kan sortere efter bestemte kolonner, men da vil din kolonne blive tolket som tekst, og dermed sorteret som tekst.

Der er dog et par muligheder alligevel:
Enten kan du håndtere sorteringen når du henter data fra databasen, og bruge den SQL query jeg foreslog i min første post.

En anden mulighed er først at kopiere tekst-strengene til en List<sting> og derefter håndtere sorteringen. En List<string> har en Sort metode, som giver mange flere muligheder end man har på en DataTable. Her er lidt testkode:

private void test()
{
    //Først opretter jeg en DataTable jeg kan teste på.
    DataTable dt = new DataTable();
    dt.Columns.Add("tekst", typeof(string));

    dt.Rows.Add("1000 bla");
    dt.Rows.Add("20  bla bla");
    dt.Rows.Add("300  bla bla bla");

   
    //Nu oprettes en List<string>.
    List<string> tekstList = new List<string>();

    //Værdierne kopieres til listen
    foreach (DataRow row in dt.Rows)
        tekstList.Add((string)row["tekst"]);

    //Listen sorteres
    tekstList.Sort(new Comparison<string>(delegate(string tekst1, string tekst2)
        {
            int tal1 = int.Parse(tekst1.Substring(0, tekst1.IndexOf(' ')));
            int tal2 = int.Parse(tekst2.Substring(0, tekst2.IndexOf(' ')));

            return tal1.CompareTo(tal2);
        }));
    //Nu er tekstList sorteret.
}
Avatar billede c-sharp Nybegynder
22. oktober 2008 - 10:57 #4
Endnu engang mange tak for din kommentar!

Men det passer desværre ikke "helt nedover min løsning endnu" :)

Din sql query virker ikke på den MySQL jeg bruger.

Set andet eksempel tager kun hånd om et felt fra min datatable (ved godt at det var det jeg viste i eksemplet, beklager) jeg skulle gerne have alle felter med på en eller anden måde.

Beklager at jeg er så vansklig.
Avatar billede aaberg Nybegynder
22. oktober 2008 - 13:05 #5
Du behøver ikke at undskylde :-)

Følgende kode tager hele rækken med, og ikke bare den ene kolonne.

private void button4_Click(object sender, EventArgs e)
{
    //Først opretter jeg en DataTable jeg kan teste på.
    DataTable dt = new DataTable();
    dt.Columns.Add("tekst", typeof(string));

    dt.Rows.Add("1000 bla");
    dt.Rows.Add("20  bla bla");
    dt.Rows.Add("300  bla bla bla");

    //Nu oprettes en List<DataRow>.
    List<DataRow> rowList = new List<DataRow>();

    //Rows kopieres til listen
    foreach (DataRow row in dt.Rows)
        rowList.Add(row);

    //Listen sorteres
    rowList.Sort(new Comparison<DataRow>(delegate(DataRow row1, DataRow row2)
        {
            string tekst1 = (string)row1["tekst"];
            string tekst2 = (string)row2["tekst"];

            int tal1 = int.Parse(tekst1.Substring(0, tekst1.IndexOf(' ')));
            int tal2 = int.Parse(tekst2.Substring(0, tekst2.IndexOf(' ')));

            return tal1.CompareTo(tal2);
        }));
    //Nu er rowList sorteret.
}


Jeg har ikke arbejdet så meget med MySql, så jeg kan desværre ikke lige mikse en tilsvarende query til MySql sammen. Men det kan helt sikkert lade sig gøre. Men koden herover bør også virke.
Avatar billede arne_v Ekspert
22. oktober 2008 - 13:13 #6
DataSet og DataTable er uafhaengige af database.
Avatar billede c-sharp Nybegynder
22. oktober 2008 - 21:04 #7
Tusind tak for hjælpen, smid et svar så er der point!
Avatar billede aaberg Nybegynder
22. oktober 2008 - 21:10 #8
:-)
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