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
Buřtík
Neregistrovaný
Avatar
Buřtík:21.10.2012 19:22

Když použiji nějakou metodu, která vrací pole, např.:

int[] pole1 = { 1, 2, 3, 4, 5};
int[] pole2 = { 8, 2, 6, 4, 9};
var poleCelkove = pole1.Intersec­t(pole2);

Jak potom můžu zjistit např počet prvků v "poleCelkove"?

poleCelkove.Length; zde nefunguje, děkuji.

 
Odpovědět
21.10.2012 19:22
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na
David Jančík:21.10.2012 19:23

Length funguje. var nepoužívej.

Nahoru Odpovědět
21.10.2012 19:23
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Buřtík
Neregistrovaný
Avatar
Buřtík:21.10.2012 19:26

Jak by tedy prosím potom vypadal ten příklad?
VS mi vyhazuje error:

System.Collec­tions.Generic­.IEnumerable<in­t> neobsahuje definici Length a nebyla nalezena žádná metoda rozšíření Length, která by přijímala první argument typu System.Collec­tions.Generic­.IEnumerable<in­t> (nechybí direktiva using nebo odkaz na sestavení?)

V případě použití jiného typu než var:

Typ System.Collec­tions.Generic­.IEnumerable<in­t> nelze implicitně převést na typ int.

 
Nahoru Odpovědět
21.10.2012 19:26
Avatar
matesax
Tvůrce
Avatar
Odpovídá na
matesax:21.10.2012 19:31

Proč tam máš var? Linq přeci vydá dynamický obsah - již to tedy není pole, ale list...

int[] a = new int[] { 1, 2, 3, 4 };
int[] b = new int[] { 5, 6, 7, 8 };

System.Collections.Generic.IEnumerable<int> c = b.Intersect(a);

int length = c.Count();
Editováno 21.10.2012 19:32
 
Nahoru Odpovědět
21.10.2012 19:31
Avatar
Buřtík
Neregistrovaný
Avatar
Odpovídá na matesax
Buřtík:21.10.2012 19:38

Tady v článku není na tohle žádný příklad, tak jsem si vygooglil to s tím varem, což mi nefungovalo. Kromě předchozích článků nemám s C# konzolí žádné zkušenosti, tak jsem o tomhle nic netušil. Děkuji, tohle mi pomohlo. :)

 
Nahoru Odpovědět
21.10.2012 19:38
Avatar
Buřtík
Neregistrovaný
Avatar
Buřtík:21.10.2012 20:03

Jak by potom vypadal nějaký příklad s Take, Skip a Reverse?
Nejde mi to ani s tím co jsi napsal. :/

 
Nahoru Odpovědět
21.10.2012 20:03
Avatar
matesax
Tvůrce
Avatar
Odpovídá na
matesax:21.10.2012 20:05

Ale co chceš? Co ti přesně nejde? Čeho chceš docílit?

 
Nahoru Odpovědět
21.10.2012 20:05
Avatar
Buřtík
Neregistrovaný
Avatar
Buřtík:21.10.2012 20:08

No když je to zde vysvětlované, tak bych rád, aby mi to fungovalo a vrátilo mi to to, co to vrátit má.. třeba "Take vrátí pole s daným počtem prvků zkopírovaných od začátku původního pole." což mi nevrací, ať dělám co dělám.

 
Nahoru Odpovědět
21.10.2012 20:08
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na
David Jančík:21.10.2012 20:20

Můžeš to pak dát do dalšího pole nebo použít to IEnumerable (dat. typ co vrací metoda Intersect) nebo třeba do seznamu.

List c = b.Intersect(a).ToList();
IEnumerable<int> c = b.Intersect(a);

Atd.

Nebo zkus metodu ToArray.

Nahoru Odpovědět
21.10.2012 20:20
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na
matesax:21.10.2012 20:23

http://msdn.microsoft.com/…b503062.aspx

No problem:

int[]
    a = new int[] { 1, 2, 3, 4 },
    b = new int[] { 5, 6, 7, 8 },
    c = b.Intersect(a).ToArray();

foreach (int item in c.OrderByDescending(item => c).Take(3))
    MessageBox.Show(item + "");
foreach (int grade in new int[] { 59, 82, 70, 56, 92, 98, 85 }.OrderByDescending(grade => grade).Take(2))
    MessageBox.Show(grade + "");
Editováno 21.10.2012 20:26
 
Nahoru Odpovědět
21.10.2012 20:23
Avatar
Buřtík
Neregistrovaný
Avatar
Buřtík:21.10.2012 20:26

Tak už mi to jde, díky moc. :)

Řešení (kdyby měl někdo stejný dotaz):

int[] pole1 = new int[] { 1, 2, 3, 4, 5 };
System.Collections.Generic.IEnumerable<int> first = pole1.Skip(2);
foreach (int s in first) {
     Console.WriteLine(s);
}
 
Nahoru Odpovědět
21.10.2012 20:26
Avatar
Buřtík
Neregistrovaný
Avatar
Buřtík:21.10.2012 20:28

Ještě se omlouvám, nezobrazovaly se mi ty dvě odpovědi, co jste mi teď postnuli, tak jsem na ně nemohl reagovat a moje předchozí zpráva už nejde smazat.:)

 
Nahoru Odpovědět
21.10.2012 20:28
Avatar
matesax
Tvůrce
Avatar
Odpovídá na
matesax:21.10.2012 20:28

Není jednodušší:

foreach (int s in new int[] { 1, 2, 3, 4, 5 }.Skip(2))
    Console.WriteLine(s);

? :)

 
Nahoru Odpovědět
21.10.2012 20:28
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
David Hartinger:21.10.2012 20:29

Můžeš psát jen IEnumerable :) Pole je jednoduše řečeno podkategorie IEnumerable (přesněji. implementuje jeho rozhraní). Do článku to doplním, nenapadlo mě, že to nevrací přímo pole.

Editováno 21.10.2012 20:31
Nahoru Odpovědět
21.10.2012 20:29
You are the greatest project you will ever work on.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:21.10.2012 20:30

Není, málokdy si pole deklaruješ v cyklu.

Nahoru Odpovědět
21.10.2012 20:30
You are the greatest project you will ever work on.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:21.10.2012 20:33

Tak to jsem asi vyjímka - takto totož zkracuji všechno... :) (Nechápu význam přechodných proměnných.)

 
Nahoru Odpovědět
21.10.2012 20:33
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:21.10.2012 22:13

Pole (v daném případě spíš seznam) se v cyklu deklaruje poměrně často, pokud je konstantní. Například v Bashi to skoro jinak nejde. Resp. to jde, ale není to triviální a často se v tom dělají chyby.

Větším nešvarem je změna hodnot proměnných za běhu programu.

Nahoru Odpovědět
21.10.2012 22:13
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
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 17 zpráv z 17.