Diskuze: Poradit

C# .NET .NET (C# a Visual Basic) Poradit American English version English version

Avatar
vodslon
Člen
Avatar
vodslon:

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:

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
 
Nahoru Odpovědět 23.3.2015 14:14
Avatar
hanpari
Redaktor
Avatar
Odpovídá na vodslon
hanpari:

Co takhle použít Count?

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

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
Redaktor
Avatar
Odpovídá na vodslon
hanpari:

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:

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  +1 23.3.2015 15:39
Avatar
hanpari
Redaktor
Avatar
Odpovídá na vodslon
hanpari:

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 23.3.2015 15:50
Avatar
vodslon
Člen
Avatar
Odpovídá na hanpari
vodslon:

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  +1 23.3.2015 16:03
Avatar
hanpari
Redaktor
Avatar
Odpovídá na vodslon
hanpari:

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
Redaktor
Avatar
Odpovídá na vodslon
hanpari:

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
Redaktor
Avatar
Odpovídá na vodslon
hanpari:

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  +1 24.3.2015 11:56
Avatar
vodslon
Člen
Avatar
Odpovídá na hanpari
vodslon:

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  +1 25.3.2015 9:47
Avatar
hanpari
Redaktor
Avatar
Odpovídá na vodslon
hanpari:

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  +1 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.