Avatar billede Slettet bruger
22. juli 2010 - 20:48 Der er 4 kommentarer og
1 løsning

Multiple sort

Jeg har f.eks følgende objekt:

class Test
{
    int Index;
    IndexOrigin Origin;
}

Og følgende enum:

enum IndexOrigin
{
    Normal,
    Before,
    After
}

Jeg vil så gerne sortere Test objektet i en List<> efter Index OG Origin. Jeg har brug for at indsætte et Test objekt ind i listen og så rekalkulere alle indexes så de er fortløbende. Men da jeg indsætter midt i listen, vil to objekter jo have samme index og jeg kan så ikke altid være sikker på at de bliver rekalkuleret i den rigtige rækkefølge. Derfor, når jeg indsætter, sætter jeg Origin property for at indikere om den skal være før eller efter det oprindelige index.

Så hvis det ligger sådan i listen:

21
22 (After) (ny)
22 (Normal)
23

Så vil se sådan ud efter sortering:

21
22 (Normal)
23 (After) (ny)
24

Origin er Normal, hvis den ikke lige er blevet indsat og enten Before eller After hvis den lige er. Jeg kan indsætte et objekt enten før eller efter et bestemt index og alt skal så rekalkuleres efterfølgende så alle indexes passer.

Jeg skal altså blot have sortet listen først efter Index og så efter Origin. Giver det mening?
Avatar billede Slettet bruger
22. juli 2010 - 21:06 #1
Fik det vidst løst selv:

[Serializable]
    public enum TitleIndexOrigin
    {
        Before = 0,
        Normal = 1,
        After = 2
    }


public void Sort(TitleSortDirection direction)
        {
            switch (direction)
            {
                case TitleSortDirection.Ascending:
                    project.Subtitle.TranslatedTitles.Sort(
                      delegate(Title t1, Title t2)
                      {
                          if (t1.Index == t2.Index)
                          {
                              return ((int)t1.IndexOrigin).CompareTo((int)t2.IndexOrigin);
                          }
                          else
                          {
                              return t1.Index - t2.Index;
                          }
                      });
                    break;
                case TitleSortDirection.Descending:
                    project.Subtitle.TranslatedTitles.Sort(
                      delegate(Title t1, Title t2)
                      {
                          if (t1.Index == t2.Index)
                          {
                              return ((int)t2.IndexOrigin).CompareTo((int)t1.IndexOrigin);
                          }
                          else
                          {
                              return t2.Index - t1.Index;
                          }
                      });
                    break;
            }
        }
Avatar billede Slettet bruger
22. juli 2010 - 21:06 #2
svar
Avatar billede bvli Praktikant
22. juli 2010 - 21:20 #3
Den korte udgave kunne se sådan her ud:

l.Sort((t1, t2) => t1.Index == t2.Index ? t1.Index - t2.Index : t2.Origin - t2.Origin);
Avatar billede Slettet bruger
22. juli 2010 - 21:26 #4
Klart :)

Det kommer selvfølgelig an på hvor læselig man ønsker at skrive det. Men ja, det gør det til en one-liner...
Avatar billede bvli Praktikant
22. juli 2010 - 21:57 #5
Der skulle have stået: t1.Index != t2.Index ....

ups
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