[c#] IComparer, objecten sorteren op 2 properties

Pagina: 1
Acties:

  • TangLeFuzZ
  • Registratie: Juni 2001
  • Laatst online: 15-10 12:48
Hey,

ik heb een Arraylist met een aantal objecten. Deze objecten wil ik sorteren op 2 verschillende values, zoals je in SQL bijvoorbeeld zou doen met een ORDER BY value1, value2.
Dus eerst sorteren op value1, en daarna op value2.

Met de IComparer interface kun je een sorteer methode schrijven voor de Arraylist.Sort() methode.
Op dit moment sorteer ik op 1 value als volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
    public class CompareMyObjects : IComparer
    {
        int IComparer.Compare(Object x, Object y)
        {
            return ((new CaseInsensitiveComparer()).Compare((y).value1, (x).value1));
        }
    }

---------------------

IComparer mijnComparer = new CompareMyObjects();
objectArrList.Sort(mijnComparer);


Deze comparer werkt goed, maar zoals je ziet sorteert hij slechts op 1 property.

Ik heb erg veel zitten zoeken op Google, maar ik kom geen uitleg tegen die voor mij duidelijk genoeg is om hem om te bouwen naar een comparer die eerst op 1 value sorteert en daarbinnen op een andere value.

Heeft iemand enig idee hoe ik dit moet doen? Ben redelijk radeloos op dit moment :)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:00

gorgi_19

Kruimeltjes zijn weer op :9

Eerst controleren of x.value1 gelijk is aan y.value1. Indien ja, dan ga je nog een keer vergelijken op value2

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
gorgi_19 schreef op zondag 21 januari 2007 @ 16:10:
Eerst controleren of x.value1 gelijk is aan y.value1. Indien ja, dan ga je nog een keer vergelijken op value2
Precies, en misschien wil je ook rekening houden met null-waarden.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class CompareMyObjects : IComparer
{
    private CaseInsensitiveComparer _stringCmp = new CaseInsensitiveComparer();

    //Typed implementation
    public int Compare(MyClass x, MyClass y)
    {
        if(x != null && y != null)
        {
            int result = _stringCmp.Compare(x.Value1, y.Value1);
            if(result != 0)
                return result;
            else
                return _stringCmp.Compare(x.Value2, y.Value2);
        }
        else
        {
            if(x == null && y == null)
                return 0;
            else
                return (x == null) ? -1 : 1;
        }
    }

    //Explicit interface implementation
    int IComparer.Compare(Object x, Object y)
    {
        return this.Compare((MyClass)x, (MyClass)y);
    }
}