Avatar
Adam Ježek
Tým ITnetwork
Avatar
Adam Ježek:

Zdravim,
mam v C# třídu s pár vlastnostma a dvouma číslama. Ta je potom v Listu<>(, který ji pak zobrazuje v datagridu). Potřeboval bych ten list seřadit podle rozdílu těch dvou čísel - nejdřív by byly prvky, kde a > b, potom a < b a pak a = b.
Takže třída

class MojeTrida {
    public string neco { get; set; }
    ....
    public int a { get; set; }
    public int b { get; set; }
}

potom je z ní list

List<MojeTrida> mojeTridaList = new List<MojeTrida>();

A pak tam jeden cyklus naplní list datama

mojeTridaList.Add(new MojeTrida() {
                        neco = nejakahodnota,
                        ....
                        a = nejakecislo,
                        b = jiinecislo
                    });

Prvků tam může být docela dost. Napadá mě vytvořit druhý list, do kterého bych postupně přidal nejdříve prvky z prvního listu, kde a>b, pak a<b a nakonec a=b. Bohužel netuším jak to udělat jinak, než že bych celý list třikrát projel foreachem a vždycky v podmínce zkontroloval a,b a potom aktuální přidal do nového listu, ale to mi připadá jako plejtvání výkonem.
Pak pokud se nepletu, tak v C# je něco jako SQL (myslím že LINQ), kde by to možná šlo že bych k listu přidal vždy něco ve stylu SELECT * FROM starylist WHERE a>b, jen vůbec netušim, jak to udělat.
Nějaké nápady?
Díky

Odpovědět 13.5.2015 21:47
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
rwn
Člen
Avatar
Odpovídá na Adam Ježek
rwn:

Nemusíš to nutně psát přímo přes sql, ale třeba lambda výrazem

mojeTridaList.Where(j => j.a > j.b).OrderByDescending(j => j.a - j.b).ToList();

Tímhle získáš List, kde a bude větší jak b a bude to seřazeno podle velikosti rozdílů mezi a a b od největšího po nejmenší. Pokud tyhle změny v seřazení nechceš použít někde jednorázově, ale nechat je na listu, tak je ještě potřeba provést přiřazení

mojeTridaList = mojeTridaList.Where(j => j.a > j.b).OrderByDescending(j => j.a - j.b).ToList();
Nahoru Odpovědět  +1 13.5.2015 22:29
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Adam Ježek
Jan Vargovský:
class MojeTrida : IComparable<MojeTrida>
{
    public int a { get; set; }
    public int b { get; set; }

    private int State
    {
        get
        {
            if (a > b)
                return 1;
            if (a < b)
                return 2;
            return 3;
        }
    }

    public int CompareTo(MojeTrida other)
    {
        return State.CompareTo(other.State);
    }
}
mojeTridaList.Sort();

EDIT: zmena na koho jsem odpovidal.

Editováno 13.5.2015 22:36
 
Nahoru Odpovědět  +3 13.5.2015 22:34
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.