Avatar billede zenny Nybegynder
09. november 2007 - 20:40 Der er 9 kommentarer og
1 løsning

Sortering af fx. tal og bogstaver

Hey hey experter.

Jeg er så endnu en C# begynder, og tænker det ville være sjovt at kigge lidt på hvordan sortering fungere.

Så ja, hvad gør jeg hvis jeg fx gerne vil sorter en række bogstaver alfabetisk?

Må gerne forklares rimelig detaljeret, så jeg rigtig kan se hvordan det virker, og vigtigere hvordan virker det?

Jeg har selvfølgelig googlet lidt på det, og har også fundet en smule, med det er bare ikke gennem dokumenteret, som jeg helst vil have det.
Avatar billede hmortensen Nybegynder
09. november 2007 - 20:56 #1
Hvis du smider det i en liste, er der en metode til at sortere:

List<string> bogstaver = new List<string>();
bogstaver.Add("B");
bogstaver.Add("A");
bogstaver.Add("D");
bogstaver.Add("C");

bogstaver.Sort();
foreach (string s in bogstaver)
  Console.WriteLine(s);
Avatar billede zenny Nybegynder
09. november 2007 - 21:27 #2
Okaay kendte ikke lige til lister x)

Jeg er sikker på at det virker meget godt, men jeg tænkte måske på en lidt mere grov måde, en form for algoritme?

Men hvis det er sådan det generalt gøres, hvordan får jeg den til at sortere fx tal, bagfra osv.

Btw, jeg behøver ikke at definere nogen størrelse på en liste, og kan bare blive ved med at fylde i den til jeg ik har mere hukommelse?

Tak for det hurtige svar btw.
Avatar billede mr-kill Nybegynder
10. november 2007 - 01:55 #3
Her er en klasse du kan arbejde lidt videre på... Skriv hvis der er noget du ikke ved hvad gør ;)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MySort mySort = new MySort();
            List<int> myList = new List<int>();

            myList.Add(4);
            myList.Add(3);
            myList.Add(1);
            myList.Add(7);
            myList.Add(100);

            mySort.OrderOfSort = SortOrder.Ascending; // Mindste først
            myList.Sort(mySort);

            Console.WriteLine("Ascending:");
            foreach (int i in myList)
                Console.WriteLine(i);

            mySort.OrderOfSort = SortOrder.Descending; // Største først
            myList.Sort(mySort);

            Console.WriteLine("Descending:");
            foreach (int i in myList)
                Console.WriteLine(i);

            Console.Read();
        }
    }

    class MySort : IComparer<int>
    {
        public SortOrder OrderOfSort;
        public CaseInsensitiveComparer ObjectCompare;

        public MySort()
        {
            OrderOfSort = SortOrder.None;
            ObjectCompare = new CaseInsensitiveComparer();
        }

        public int Compare(int x, int y)
        {
            int compareResult;

            compareResult = ObjectCompare.Compare(x, y);

            if (OrderOfSort == SortOrder.Ascending)
                return compareResult;
            else if (OrderOfSort == SortOrder.Descending)
                return (-compareResult);
            else
                return 0;
        }
    }
}
Avatar billede zenny Nybegynder
10. november 2007 - 11:08 #4
Hey, det ligner mere det jeg søgte, nemlig en komplet kode at arbejde med, men jeg kan se at der er dele af koden som jeg ikke har arbejdet med før.

Jeg brude nok at være lidt mere sikker i class'er, så kan jeg lokke dig til at kommenter din kode, gerne rimelig detaljeret. Så smider du bare et svar sammen med det. Tak for hjælpen :)
Avatar billede zenny Nybegynder
10. november 2007 - 11:10 #5
Btw når jeg prøver at køre koden siger den:

The type or namespace name 'SortOrder' could not be found (are you missing a using directive or an assembly reference?
Avatar billede hmortensen Nybegynder
10. november 2007 - 13:21 #6
Hvis du vil dykke helt ned i sorting, vil jeg anbefale dig at læse om algoritmer her:
http://en.wikipedia.org/wiki/Sorting_algorithm

Her er der så et eksempel som sorterer et int array vha. bubblesort algoritmen.
static void Main()
{
  int[] myInts = new int[5] { 4, 2, 7, 1, 8 };
  BubbleSort(myInts);
  foreach (int i in myInts)
  {
    Console.WriteLine(i);
  }
}

public static void BubbleSort(int[] ar)
{
  for (int pass = 1; pass < ar.Length; pass++)
    for (int i = 0; i < ar.Length - 1; i++)
      if (ar[i] > ar[i + 1])
        Swap(ar, i);
}

public static void Swap(int[] ar, int first)
{
  int hold;
  hold = ar[first];
  ar[first] = ar[first + 1];
  ar[first + 1] = hold;
}

Det der sker ved sorteringen, er at værdierne bliver byttet rundt, hvis det er nødvendigt, hvilket kan ses på denne ilustration:
http://www.u-helmich.de/inf/BlueJ/kurs11_alt/seite05/bubblesort.gif

Hvilket vil sige, at hvis det første tal er større end det næste, vil de bytte plads, og så vil det næste par sammenlignes, osv.
Avatar billede mr-kill Nybegynder
10. november 2007 - 16:45 #7
Du skal tilføje System.Windows.Forms i "References" fordi SortOrder hører til der og den er ikke standart i en console app.

Nu har jeg forklaret en masse. Hvis der er mere du ikke er helt med på så siger du bare til ;)


using System; //Indeholder bl.a. Console klassen
using System.Collections; //indeholder bl.a. CaseInsensitiveComparer
using System.Collections.Generic; //indeholder bl.a. IComparer<T>
using System.Windows.Forms; // indeholder bl.a. SortOrder.

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MySort mySort = new MySort(); //Laver en tilgang til min egen klasse "MySort" og kalder den mySort
            List<int> myList = new List<int>(); //Laver liste kaldet "myList"
            /*
            Lister er som arrays bare uden man bestemmer størelse.
            Du kan tilføje alle de elementer du vil og så laver den selv den størelse der er brug for.
            Jeg skriver <int> fordi alle objects der tilføjes skal være af typen int
            */

            myList.Add(4); // Man siger [liste navn].Add(object af typen int) for at tilføje et element
            myList.Add(3);
            myList.Add(1);
            myList.Add(7);
            myList.Add(100);

            mySort.OrderOfSort = SortOrder.Ascending; // Mindste først
            //Den klasse vi bruger til at sortere har en public variabel der hedder "OrderOfSort" til at være om det skal være forfra eller bagfra

            myList.Sort(mySort); //lister kan sorteres med [liste navn].Sort() Man kan bl.a. vælge at give en klasse med der nedarver fra "IComparer<T>"

            Console.WriteLine("Ascending:");
            foreach (int i in myList) //kører alle elementer igennem og udskriver dem
                Console.WriteLine(i);

            mySort.OrderOfSort = SortOrder.Descending; // Største først
            myList.Sort(mySort);

            Console.WriteLine("Descending:");
            foreach (int i in myList)
                Console.WriteLine(i);

            Console.Read();
        }
    }

    class MySort : IComparer<int>
    { //Jeg opretter en klasse der hedder MySort Den nedarver fra IComparer<T>. "T" Skal skiftes ud med den type det er . I dette tilfælde int.
        public SortOrder OrderOfSort; //Denne variabel holder styr på om det er forfra eller bagfra. Den er af typen "SortOrder", som er et enum.
        public CaseInsensitiveComparer ObjectCompare; //Her vælger vi om der skal tages forbehold fra store og små bogstaver (Det har ingen betydning når det er tal)

        public MySort() //Her er klassens constructor (Det er den metode der bliver kladt når klassen oprettes)
        {
            OrderOfSort = SortOrder.None; // Her sættes "OrderOfSort" til "None" (Det vil sige at der ikke sorteres på nogen måde)
            ObjectCompare = new CaseInsensitiveComparer(); //Jeg vælger at der skal være forskel på store og små bogstaver (igen det har ingen betydning i dette tilfælde, men det kan jo være du vil bruge strings på et tidspunkt)
        }
        /*
        Alle klasser der nedarver fra "IComparer<T>" skal indeholde denne metode. Det er den metode der bliver brugt til at sortere.
        Når der skal sorteres så skal alle objecter holdes op mod hinanden.
        */
        public int Compare(int x, int y)
        {
            int compareResult; //Denne variabel indeholder resultatet for når de holdes op imod hinanden.

            compareResult = ObjectCompare.Compare(x, y); // Jeg bruger ObjectCompare.Compare metoden til at sammenligne.
            //Hvis x er størst så bliver tallet der kommer ud over 0 og hvis y er størst så bliver det under 0 og hvis det er det samme så er der 0.

            if (OrderOfSort == SortOrder.Ascending) //Hvis det er frafra (rigtig rækkefølge) så returnere vi bare resultatet
                return compareResult;
            else if (OrderOfSort == SortOrder.Descending) //Hvis det er bagfra (omvendt) så skal der byttes rundt på resultatet (1 bliver til -1 og -1 bliver til 1)
                return (-compareResult);
            else //ellers skal der slet ikke sorteres så vi returnere bare 0.
                return 0;
        }
    }
}
Avatar billede zenny Nybegynder
10. november 2007 - 17:32 #8
Det var lige noget som det jeg søgte hmortensen !) Så har jeg lidt at arbejde med igen :)

smid et svar
Avatar billede zenny Nybegynder
10. november 2007 - 17:36 #9
Nå dada, måske jeg skulle opdatere mine sider lidt oftere x) Det ser godt ud Mr Kill.

Kan jeg give points til 2 personer?
Avatar billede mr-kill Nybegynder
10. november 2007 - 18:33 #10
Du kunne godt ha givet os begge point hvis du havde ventet til hmortensen havde smidt et svar.

hmortensen >> Hvis du føler dig snydt, så skriv lige i denne tråd så skal jeg nok lave en ny tråd så du kan få din andel.
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