IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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
vodslon
Člen
Avatar
vodslon:23.3.2015 13:47

Ahoj, jsem začátečník, chci se zeptat šla by ta část int PocetElementu zlepšit? Je to jenom takovej obecná věc, která zkouší random, ale narazil jsem na něco podobného jinde, prostě mi to příjde špatně, jak to dělám a špatně i to bude, i když je to funkční. Za rady moc děkuji

Obecně jde o metodu, která počítá počet objektů na základě podmínky v Listu.

chart1.Series.Clear();
            chart1.Series.Add("KolikCisel");
            chart1.Series["KolikCisel"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column;
            chart1.Series["KolikCisel"].IsValueShownAsLabel = true;

            List<int> Cisla = new List<int>();
            Random r = new Random();
            for (int i = 0; i < 100000; i++)
            {
                int temp = r.Next(0, 9);
                Cisla.Add(temp);
            }

            for (int i = 0; i < 9; i++)
            {
                int PocetElementu = (new Func<int>(() =>
                {
                    IEnumerable<int> vysledek = from cislo in Cisla where cislo == i select cislo;
                    IEnumerator<int> a = vysledek.GetEnumerator();
                    int pocetelementu = 0;
                    while (a.MoveNext())
                    {
                        pocetelementu++;
                    }
                    return pocetelementu;
                }))();
                chart1.Series["KolikCisel"].Points.AddY(PocetElementu);
            }
 
Odpovědět
23.3.2015 13:47
Avatar
vodslon
Člen
Avatar
Odpovídá na vodslon
vodslon:23.3.2015 14:07

Tak už jsem to vylepšil, jako kdybych sem nic nepsal.

chart1.Series.Clear();
            chart1.Series.Add("KolikCisel");
            chart1.Series["KolikCisel"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column;
            chart1.Series["KolikCisel"].IsValueShownAsLabel = true;

            List<int> Cisla = new List<int>();
            Random r = new Random();
            for (int i = 0; i < 9000; i++)
            {
                int temp = r.Next(0, 9);
                Cisla.Add(temp);
            }

            for (int i = 0; i < 9; i++)
            {
                int PocetElementu = (new Func<int>(() =>
                {
                    return (from cislo in Cisla where cislo == i select cislo).Count<int>();

                }))();
                chart1.Series["KolikCisel"].Points.AddY(PocetElementu);
            }
 
Nahoru Odpovědět
23.3.2015 14:07
Avatar
Odpovídá na vodslon
sadlomaslox25:23.3.2015 14:14

pouzij GroupBy https://msdn.microsoft.com/…b545971.aspx
to ti zkrati kod na polovinu.

 
Nahoru Odpovědět
23.3.2015 14:14
Avatar
hanpari
Člen
Avatar
Odpovídá na vodslon
hanpari:23.3.2015 14:40

Co takhle použít Count?

 
Nahoru Odpovědět
23.3.2015 14:40
Avatar
hanpari
Člen
Avatar
Odpovídá na vodslon
hanpari:23.3.2015 14:46

ještě příklad :)

int[] test = {1,2,3,4,2,1,6,5,1};

int res = (from i in test
           where i == 1
           select i).Count();
Console.WriteLine(res); // Vypíše 3
Editováno 23.3.2015 14:46
 
Nahoru Odpovědět
23.3.2015 14:46
Avatar
hanpari
Člen
Avatar
Odpovídá na vodslon
hanpari:23.3.2015 14:54

Pardon, ty ho vlastně používáš. Moje chyba :)

 
Nahoru Odpovědět
23.3.2015 14:54
Avatar
vodslon
Člen
Avatar
Odpovídá na hanpari
vodslon:23.3.2015 15:39

Mě to ráno vůbec něják nedošlo, že ten select můžu zavřít do závorky a použít metodu count rovnou na něm :-)

 
Nahoru Odpovědět
23.3.2015 15:39
Avatar
hanpari
Člen
Avatar
Odpovídá na vodslon
hanpari:23.3.2015 15:50

Tohle je zatím nejlepší, co mne napadlo :) bez groupBy, co doporučoval kolega nahoře:

int[] test = {1,2,3,4,2,1,6,5,1};
var result = new Dictionary<int, int>();
foreach (int element in test.Distinct())
                       {
    result[element] = test.Count(i => i==element);
                        }

výsledek dostaneš pěkně do slovníku, kde klíče jsou jednotlivá čísla. Předpokládám, že groupby by udělalo totéž :)
Také jsem zjistil, že where z předchozího můžu vynechat

Editováno 23.3.2015 15:52
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
23.3.2015 15:50
Avatar
vodslon
Člen
Avatar
Odpovídá na hanpari
vodslon:23.3.2015 16:03

To je moc pěkný řešení :-). Takové jednoduché funkční,tak to má být..
To se mi líbí na c#, jak je možný vzít "úkol" co chci napsat a ted existuje strašně moc způsobů, jak toho řešení dosáhnout.

a třeba i potom by zase se to řešení ukázalo jako nevhodně, při další práci s ním, třeba Dictonary elegatně natlačit do toho grafu atd.

 
Nahoru Odpovědět
23.3.2015 16:03
Avatar
hanpari
Člen
Avatar
Odpovídá na vodslon
hanpari:23.3.2015 16:05

Díky, ale teď to ještě natlačit na jeden řádek :) Mně se to zatím moc nelíbí :)

 
Nahoru Odpovědět
23.3.2015 16:05
Avatar
hanpari
Člen
Avatar
Odpovídá na vodslon
hanpari:24.3.2015 11:31

Zatím můj nejlepší pokus (alespoň co se týče délky :)). Bohužel není výsledek slovník,
jen dvojice klíč a hodnota.

int[] test = {1,2,3,4,2,1,6,5,1};
var pokus = test.GroupBy(i => i).Select(i => new {key = i.First(), value = i.Count()});

//vypis
foreach (var elem in pokus)
    {
    Console.WriteLine("Klíč: {0} Hodnota: {1}", elem.key, elem.value);
    }
Editováno 24.3.2015 11:32
 
Nahoru Odpovědět
24.3.2015 11:31
Avatar
hanpari
Člen
Avatar
Odpovídá na vodslon
hanpari:24.3.2015 11:56

Odvolávám a snad už naposledy, tohle je zatím nejlepší co se délky týče. :)
A opravdu vytvoří slovník.

int[] test = {1,2,3,4,2,1,6,5,1};
Dictionary<int, int> pokus2 = test.GroupBy(i=>i).ToDictionary(key => key.First(), value => value.Count());
 
Nahoru Odpovědět
24.3.2015 11:56
Avatar
vodslon
Člen
Avatar
Odpovídá na hanpari
vodslon:25.3.2015 9:47

Pěkný :) Já jsem do toho Groupby moc zatím nepronikl a tak ho spíše asi obcházím..Je to moc pěknej zápis, neznal jsem ani metodu na array to ToDictonary, popravdě docela i koukám, že to funguje jak má :)

 
Nahoru Odpovědět
25.3.2015 9:47
Avatar
hanpari
Člen
Avatar
Odpovídá na vodslon
hanpari:25.3.2015 16:40

GroupBy vytvoří výčet podmnožin podle zadaného kritéria.
Zde:
{1,1,1}
{2,2}
{3}
atd

Ten pak procházím a vytvořím klíč z prvního prvku(v podmnožině jsou jen stejné prvky) a hodnotu z počtu prvků dané podmnožiny.

ToDictionary tuším patří do LINQ, takže ho můžeš používat nejen na pole.

Bylo to zajímavé zadání, takové je radost řešit. Díky za něj :)
Jen bych si nedělal velké iluze o rychlosti toho řešení.

Editováno 25.3.2015 16:41
 
Nahoru Odpovědět
25.3.2015 16:40
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 14 zpráv z 14.