Diskuze: Celková délka pole

C# .NET .NET (C# a Visual Basic) Celková délka pole American English version English version

Aktivity (1)
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
Odpovídá na Buřtík
David Jančík [sczdavos]:21.10.2012 19:23

Length funguje. var nepoužívej.

Nahoru Odpovědět 21.10.2012 19:23
Čím více času dostaneš, tím méně ho máš.
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
Redaktor
Avatar
Odpovídá na Buřtík
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
Redaktor
Avatar
Odpovídá na Buřtík
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
Odpovídá na Buřtík
David Jančík [sczdavos]: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
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Buřtík
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
Redaktor
Avatar
Odpovídá na Buřtík
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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Buřtík
David Čápka: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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:21.10.2012 20:30

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

Nahoru Odpovědět 21.10.2012 20:30
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Čápka
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
Redaktor
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.