Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Adam Ježek
Tvůrce
Avatar
Adam Ježek:13.5.2015 21:47

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
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
rawen
Člen
Avatar
Odpovídá na Adam Ježek
rawen:13.5.2015 22:29

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
13.5.2015 22:29
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Adam Ježek
Jan Vargovský:13.5.2015 22:34
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
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.