Avatar billede jesper_dk Nybegynder
15. juli 2005 - 22:04 Der er 5 kommentarer og
1 løsning

Array.Sort problem

Hej
Jeg har et problem med Array.Sort metoden i c#

jeg har et program, der skal lave noget resultat beregning.
i mit program har jeg et array, som jeg vil sortere så jeg får sorteret mine objekter i rangorden.

Mine objekter der ligger i det array jeg vil sortere implementere IComparabl.

Jeg har lavet noget kode der sortere mine objekter efter tid, koden ser sådan ud:

#region IComparable Members

public int CompareTo(object obj)
{
Baad comBaad = (Baad) obj;

if (this.Resultatlinje == null || comBaad.Resultatlinje == null )
    {
      return -1;
    }


if (this.Resultatlinje.Sejltid == comBaad.Resultatlinje.Sejltid )
    {
        return 0;
    }
           
if (this.Resultatlinje.Sejltid > comBaad.Resultatlinje.Sejltid)
    {
        return 1;
    }
else
    {
        return -1;
    }
           
}

#endregion

det virker fint og sortere mine objekter rigtigt.


men på mine objekter har jeg også noget jeg kalder "specialtime"
det er tider der altid sal sorteres ned i bunden af mit array

der for har jeg ændret min kode så den nu ser sådan ud:

#region IComparable Members

public int CompareTo(object obj)
{
    Baad comBaad = (Baad) obj;

if (this.Resultatlinje == null || comBaad.Resultatlinje == null )
{
    return -1;
}
//NU KODE START
if (this.Resultatlinje.SpecialTime != "no")
{
    return 1;
}

if (comBaad.Resultatlinje.SpecialTime != "no")
{
    return 0;
}
//NU KODE SLUT
if (this.Resultatlinje.Sejltid == comBaad.Resultatlinje.Sejltid )
{
    return 0;
}

if (this.Resultatlinje.Sejltid > comBaad.Resultatlinje.Sejltid)
{
    return 1;
}
else
{
    return -1;
}
           
}
#endregion

men når jeg tilføjer den nye kode sorteres mit array totalt underlig, mine "specialtimes" bliver godt nok laget ned i bunden, men mine tider bliver ikke sorteret rigtigt mere.
her under er hvor dan mine objekter bliver sorteret før og efter min nye kode:

før ny kode:

DSQ (specialtime, ligger i top da den har den korteste tid)
00:26:16
00:26:57
00:27:08

efter ny kode:

00:26:57
00:27:08
00:26:16
DSQ(specialtime)

er der nogle der har en forklaring på dette/kan finde en fejl i min kode.
00:26:57
Avatar billede arne_v Ekspert
15. juli 2005 - 22:17 #1
skal


if (comBaad.Resultatlinje.SpecialTime != "no")
{
    return 0;
}

ikke være


if (comBaad.Resultatlinje.SpecialTime != "no")
{
    return -1;
}

?
Avatar billede arne_v Ekspert
15. juli 2005 - 22:18 #2
men ellers virker logikken OK

følgende giver det rigtige resultat hos mig:

using System;

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)
    {
        if(b == "SPECIAL")
        {
            return 1;
        }
        if(((Foobar)o).B == "SPECIAL")
        {
            return -1;
        }
        return (a - ((Foobar)o).A);
    }
    public override string ToString()
    {
        return ("(" + a + "," + b + ")");
    }
}

class SpecialSort
{
  public static void Main(string[] args)
    {
        Foobar[] arr = new Foobar[6];
        arr[0] = new Foobar(3, "");
        arr[1] = new Foobar(2, "SPECIAL");
        arr[2] = new Foobar(6, "");
        arr[3] = new Foobar(1, "");
        arr[4] = new Foobar(5, "SPECIAL");
        arr[5] = new Foobar(4, "");
        Array.Sort(arr);
        for(int i = 0; i < arr.Length; i++)
        {
            Console.WriteLine(arr[i]);
        }
    }
}
Avatar billede jesper_dk Nybegynder
15. juli 2005 - 22:28 #3
selvfølgelig, 0 er når de er ens
smid lige et svar hvis du vil have poing, mange tak for hjælpen
Avatar billede arne_v Ekspert
15. juli 2005 - 22:28 #4
ok
Avatar billede arne_v Ekspert
15. juli 2005 - 22:28 #5
men var det det som var skyld i dit problem ?
Avatar billede jesper_dk Nybegynder
15. juli 2005 - 22:30 #6
jep jeg havde jo lavet en if der siger, at hvis min combaad har en "specialtime" så er den ens med objektet, og det var jo ikke tilfældet
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