Avatar billede idiotbarn Nybegynder
26. september 2005 - 23:23 Der er 6 kommentarer og
1 løsning

Sortere egen klasse - IComparable

Jeg har en klasse, BandMatch, som får tildelt nogen point. Disse points kan hentes ud med TotalPoint.
En arraylist indeholder nu x antal BandMatch, og nu vil jeg gerne kunne sortere dem efter det tal som TotalPoint retunere. Jeg har forsøgt med:

public class BandMatch : IComparable
                      {
                          String _BandNavn;
                          int _BandId;
                          int _Inspiration, _Beskrivelse;

                          public int CompareTo(BandMatch rhs)
                            {
                                return this.TotalPoint.CompareTo(rhs.TotalPoint);
                            }

                          public BandMatch(String BN, int Id)
                              {
                                  _BandNavn=BN;
                                  _BandId=Id;
                                  _Inspiration=0;
                                  _Beskrivelse=0;
                              }
...

men får hele tiden fejlen:
CS0535: 'ASP.SearchSound_aspx.BandMatch' does not implement interface member 'System.IComparable.CompareTo(object)'

Så...1: Hvad er det der er galt
og 2: vil det overhovedet virke? Jeg har ikke arbejdet med dette før
Avatar billede idiotbarn Nybegynder
26. september 2005 - 23:25 #1
Faktisk tror jeg ikke helt på at det vil virke, da det vel egentligt er ArrayList'ens CompareTo der skal overskrives?
Avatar billede arne_v Ekspert
26. september 2005 - 23:31 #2
public int CompareTo(object rhs)
                            {
                                return this.TotalPoint.CompareTo(((BandMatch)rhs).TotalPoint);
                            }
Avatar billede arne_v Ekspert
26. september 2005 - 23:32 #3
mit kendte sorterings eksempel:

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 idiotbarn Nybegynder
26. september 2005 - 23:35 #4
Hej arne. Tak, jeg kikker lige lidt nærmere på det i morgen,Der skal nok være en masse spørgsmål :)
Avatar billede idiotbarn Nybegynder
27. september 2005 - 17:41 #5
Hej...Det virker jo fantastisk...SKAL det være:
public int CompareTo(object rhs)
for troede egentligt det var fint bare der var CompareTo, som det jeg havde først?

Men ligger du et svar? Takker
Avatar billede arne_v Ekspert
27. september 2005 - 18:34 #6
C# supporterer operator overloading d.v.s. at antal og typer af argumenter
indgår i metode navnet

----

og svar
Avatar billede idiotbarn Nybegynder
27. september 2005 - 18:35 #7
Nåh ja...det er vel egentligt klart...Tak
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