Avatar billede stalle Nybegynder
09. januar 2006 - 20:15 Der er 6 kommentarer og
1 løsning

Sortering af array

Nu har jeg forsøgt mig lidt frem og tilbage, men har simpelthen ikke haft held til og lave en sortering af mit array.

Det jeg har, ser ud som følger:

public class VariAbler
    {
        public string Var;
        public string Linie;
        public string Fil;
    }

Jeg fylder i arrayet sådan her:

VariAbler v = new VariAbler();
v.Var = tempVAR;
v.Linie = line;
v.Fil = file.Name;
                                    variabelArray.Add(v);

Jeg vil gerne have lavet sorteringen, så den tager højde for alle værdier.
Det skal forståes sådan, at sorteringen laves så v.Var har første prioritet, så kommer v.Linie og til sidst v.Fil

Håber der er nogen der kan vise mig lyset.
Avatar billede arne_v Ekspert
09. januar 2006 - 20:29 #1
du lader din klasse implementere IComparable (med en CompareTo metode)
Avatar billede arne_v Ekspert
09. januar 2006 - 20:30 #2
et eksempel:

using System;
using System.Collections;

public class MitObjekt : IComparable
{
    private int etNummer;
    private string etNavn;
    public MitObjekt(int etNummer, string etNavn)
    {
        this.etNummer = etNummer;
        this.etNavn = etNavn;
    }
    public int EtNummer
    {
        get
        {
            return etNummer;
        }
    }
    public string EtNavn
    {
        get
        {
            return etNavn;
        }
    }
    public int CompareTo(object o)
    {
        MitObjekt mo = (MitObjekt)o;
        if(etNummer == mo.etNummer)
        {
            return etNavn.CompareTo(mo.etNavn);
        }
        else
        {
            return etNummer - mo.etNummer;
        }
    }
    public override string ToString()
    {
        return (etNummer + " " + etNavn);
    }
}
class MainClass
{
    public static void Main(string[] args)
    {
        ArrayList list = new ArrayList();
        list.Add(new MitObjekt(3, "TRE"));
        list.Add(new MitObjekt(2, "TO-A"));
        list.Add(new MitObjekt(2, "TO-C"));
        list.Add(new MitObjekt(2, "TO-B"));
        list.Add(new MitObjekt(1, "ET"));
        Console.WriteLine("Før sortering:");
        for(int i = 0; i < list.Count; i++)
        {
            Console.WriteLine(list[i]);
        }
        list.Sort();
        Console.WriteLine("Efter sortering:");
        for(int i = 0; i < list.Count; i++)
        {
            Console.WriteLine(list[i]);
        }
    }
}
Avatar billede jens_klinting Nybegynder
14. januar 2006 - 13:08 #3
Alternativt kan du, hvis du har brug for at variere måden, der skal sorteres på, implementere en System.Collections.IComparer.

Men det afhænger af brugsscenariet.
Avatar billede jens_klinting Nybegynder
14. januar 2006 - 13:11 #4
Og benytte System.Array.Sort(mitArray, minComparer) til at foretage sorteringen.
Avatar billede arne_v Ekspert
16. januar 2006 - 09:14 #5
et eksempel med IComparer:

using System;
using System.Collections;

public class Foobar : IComparable
{
    private int a;
    private string b;
    public Foobar() : this(0, "")
    {
    }
    public Foobar(int a, string b)
    {
        this.a = a;
        this.b = b;
    }
    public int A
    {
        get
        {
            return a;
        }
        set
        {
            a = value;
        }
    }
    public string B
    {
        get
        {
            return b;
        }
        set
        {
            b = value;
        }
    }
    public int CompareTo(object o)
    {
        return (a - ((Foobar)o).A);
    }
    public override string ToString()
    {
        return ("(" + a + "," + b + ")");
    }
}

public class FoobarAComparer : IComparer
{
    int IComparer.Compare(Object o1, Object o2)
    {
        return (((Foobar)o1).A - ((Foobar)o2).A);
    }
}

public class FoobarRevAComparer : IComparer
{
    int IComparer.Compare(Object o1, Object o2)
    {
        return -(((Foobar)o1).A - ((Foobar)o2).A);
    }
}

public class FoobarBComparer : IComparer
{
    int IComparer.Compare(Object o1, Object o2)
    {
        return (((Foobar)o1).B.CompareTo(((Foobar)o2).B));
    }
}

public class FoobarRevBComparer : IComparer
{
    int IComparer.Compare(Object o1, Object o2)
    {
        return -(((Foobar)o1).B.CompareTo(((Foobar)o2).B));
    }
}

class ManySort
{
    private static void print(string descr, ArrayList list)
    {
        Console.Write(descr + ": [");
        foreach(object o in list)
        {
            Console.Write(o);
        }
        Console.WriteLine("]");
    }
    public static void Main(string[] args)
    {
        ArrayList list = new ArrayList();
        list.Add(new Foobar(5, "AAAAA"));
        list.Add(new Foobar(4, "BBBB"));
        list.Add(new Foobar(3, "CCC"));
        list.Add(new Foobar(2, "DD"));
        list.Add(new Foobar(1, "E"));
        print("Original", list);
        list.Sort();
        print("After natural sort (= sort on A)", list);
        list.Sort(new FoobarRevAComparer());
        print("After reverse sort on A", list);
        list.Sort(new FoobarAComparer());
        print("After sort on A", list);
        list.Sort(new FoobarBComparer());
        print("After sort on B", list);
        list.Sort(new FoobarRevBComparer());
        print("After reverse sort on B",list);
    }
}
Avatar billede arne_v Ekspert
12. marts 2006 - 05:45 #6
OK ?
Avatar billede stalle Nybegynder
12. marts 2006 - 11:00 #7
Jeg har desværre ikke fået kigget så meget på det, men er sikker på at dit forslag vil virke - skal bare lige rode nok med det.

Du får point...
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