C# Předání odkazu na seznam (List) – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C# Předání odkazu na seznam (List) – .NET – Fórum – Programujte.comC# Předání odkazu na seznam (List) – .NET – Fórum – Programujte.com

 

End
~ Anonymní uživatel
49 příspěvků
17. 4. 2015   #1
-
0
-

Zdravím, začínám se učit, takže mám začátečnický dotaz. U jednoduchých hodnotových typů předávání rozumím, ale teď jsem narazil na potřebu předat referenci na proměnnou (či přesněji asi objekt?) typu List.

 V hlavním kodu mám deklaraci

List<Customer> _customers = new List<Customer>();

a _customer potřebuji předat do jiné metody v jiné třídě. Můj nepovedený pokus deklarace hlavičky metody je: 

public int NewCustomer(List <Customer> cust, string name)
{
...
}
Nahlásit jako SPAM
IP: 89.102.247.–
ingiraxo+15
Grafoman
17. 4. 2015   #2
-
0
-

#1 End
co přesně ti na tom nefunguje? Co to píše za chybu?

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
End
~ Anonymní uživatel
49 příspěvků
17. 4. 2015   #3
-
0
-

#2 ingiraxo
    The type or namespace name 'List' could not be found (are you missing a using directive or an assembly reference?)    C:\Users\Sir\AppData\Local\Temporary Projects\Cviceni\Zamestanec.cs    15    36    Cviceni

namespace je totožný o obojího

Nahlásit jako SPAM
IP: 89.102.247.–
ondrej39+1
Věrný člen
17. 4. 2015   #4
-
0
-

#3 End

To ti většinou píše, když nemáš naincludovanou knihovnu. Přidej si nahoru do programu.

using System.Collections.Generic;
Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
End
~ Anonymní uživatel
49 příspěvků
17. 4. 2015   #5
-
0
-

#4 ondrej39
jo, přidáno a hláška zmizela, díky

to ingiraxo: koukal jsem tvůj web ophite - pěkný. Něco takovýho by se mi hodilo. To je plugin nebo tvoje vlastní tvorba?

Nahlásit jako SPAM
IP: 89.102.247.–
ingiraxo+15
Grafoman
17. 4. 2015   #6
-
0
-

#5 End
všechny app, videa včetně webu je kompletně moje tvorba

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Kit+15
Guru
18. 4. 2015   #7
-
0
-

#6 ingiraxo
Uvažuješ o tom, že bys některé z těch app vydal jako Open Source?

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ingiraxo+15
Grafoman
18. 4. 2015   #8
-
0
-

#7 Kit
zatím jsem nad tím neuvažoval

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
end0
Newbie
20. 4. 2015   #9
-
0
-

Mám ještě jeden začátečnický dotaz:

udělal jsem si třídy (3soubory cs), vytvořil soubor knihovny a teď nevím, jak ty soubory třídy k té knihovně připojit/vložit/ přilinkovat nebo jak se tomu v c# správně říká. 

Nahlásit jako SPAM
IP: 89.102.247.–
ingiraxo+15
Grafoman
20. 4. 2015   #10
-
0
-

#9 end
nechápu... pokud sis udělal knihovnu a do té dal ty 3 třídy, tak proste do samotný aplikace přidáš referenci na knihovnu a normálné zavoláš třídy

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
End
~ Anonymní uživatel
49 příspěvků
22. 4. 2015   #11
-
0
-

v solution exploreru pravý klik na references a přidat -> z existující knihovny (popř přidej té svojí .dll původní projekt, ať to můžeš upravovat přímo).

Tak tohle jsem potřeboval a zřejmě neuměl popsat. Provedeno, knihovna přidána, ještě ta druhá část - tučně označeno - jak toto provedu?

Nahlásit jako SPAM
IP: 89.102.247.–
End
~ Anonymní uživatel
49 příspěvků
12. 5. 2015   #12
-
0
-

Tak bych měl další dotaz ohledně C# - ohledně funcionality foreach

int[] fibarray = new int[] { 0, 1, 1, 2, 3, 5, 8, 13 };
            foreach (int i in fibarray)
            {
                System.Console.WriteLine(i);
            }

mi vypíše prvky pole pod sebe od indexu nula po poslední. Mohu přes foreach dosáhnout obráceného pořadí? Pokud ano, jak?

Pokud nikoliv, tak samozřejmě přes cykly třeba while. Co když potřebuji ale procházet proměnnou Dictionary<string, int> - nevím, jak se indexem z cyklu pohybovat v Dictionary, kde je klíčem string hodnota.

Děkuji za pomoc.

Nahlásit jako SPAM
IP: 89.102.247.–
ondrej39+1
Věrný člen
12. 5. 2015   #13
-
+1
-
Zajímavé
Kit +

#12 End
Dosáhnout toho pochopitelně můžeš, v tvém případě použitím metody Reverse.

foreach (var i in fibarray.Reverse())
{
    Console.WriteLine(i);
}

U slovníku je to úplně to samé.

var slovnik = new Dictionary<string, int> {{"Klic 1", 10}, {"Klic 2", 15}, {"Klic 3", 20}};

foreach (var prvek in slovnik.Reverse())
{
    Console.WriteLine(prvek.Key + " " + prvek.Value);
}

// Output

Klic 3 20
Klic 2 15
Klic 1 10
Nahlásit jako SPAM
IP: 213.226.234.–
Inject all the dependencies!
P
~ Anonymní uživatel
212 příspěvků
Nahlásit jako SPAM
IP: 85.93.116.–
ingiraxo+15
Grafoman
13. 5. 2015   #15
-
0
-

#12 End
nelze.. foreach iteruje vždy od začátku.. pokud chceš pozpátku, tak použij klasický for

#13 ondrej39
Pro jeho případ je nesmysl používat Reverse.. linq je mnohem náročnější než normální reverzní cyklus.. kór když to jen potřebuje vypsat

U toho Reverse z Linq je "problém", že on překopíruje celou kolekci do nové, u ní následně otočí pořadí prvků a vrátí výslednou kopii... takže se provádějí naprosto zbytečný operace, který jsou při větší kolekci poměrně náročný... nedej bože, kdyby se volal pokaždý pří zavolání metody

 V mém api používám toto pro reverzní výpis:

public static void ReverseForeach<T>(this IList arr, Action<T, int, bool> callback)
{
    if (arr == null) return;
	
    for (int i = arr.Count - 1; i >= 0; i--) {
        callback((T)arr[i], i, (i == 0));
    }
}

// Použití

int[] nums = {1,2,3};
nums.ReverseForeach<int>((n,i,l) => { Console.WriteLine(n); });
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
ingiraxo+15
Grafoman
13. 5. 2015   #16
-
0
-

Co se týče toho Dictionary, tak to záleží k čemu ho přesně používáš.. můžeš rozšířit slovník o indexování např. 

class IndexedDictionary<K, V> : Dictionary<K, V>
{
    private readonly List<K> _keys = new List<K>();

    public new virtual void Add(K key, V value) {
        if (!ContainsKey(key)) {
            base.Add(key, value);
            _keys.Add(key);
        }
    }

    public new virtual void Remove(K key) {
        if (ContainsKey(key)) {
            base.Remove(key);
            _keys.Remove(key);
        }
    }

    public V GetValueByIndex(int index) {
        if (_keys.Count > 0 && index >= 0 && index < _keys.Count) {
            return this[_keys[index]];
        }
        return default(V);
    }

    public void Reverse(Action<K, V> callback) {
        for (int i = _keys.Count - 1; i >= 0; i--) {
            callback(_keys[i], this[_keys[i]]);
        }
    }
}

Použít to pak můžeš jako 

IndexedDictionary<string, int> map = new IndexedDictionary<string, int>();
map.Add("one", 1);
map.Add("two", 2);
map.Add("three", 3);

// klasický
for (int i = 0; i < map.Count; i++) {
    Console.WriteLine(map.GetValueByIndex(i));
}

// reverzní
map.Reverse((k, v) => { Console.WriteLine(k + "=>" + v); });

Já osobně nemám rád Linq, protože žere X-krát víc paměti a i samotná výpočetní náročnost je vyšší na úkor pohodlí

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Matěj Andrle+1
Grafoman
14. 5. 2015   #17
-
0
-

#15 ingiraxo
Já nikdy nepochopím, proč přesouvat celou položku, když stačí řešit indexy...To je takový problém?

for (int index = list.Count; index-- > -1;)
	ddd(list[index]);

Žádná halda, žádný GarbageCollector, žádné memory lake, ...

Nahlásit jako SPAM
IP: 78.136.162.–
ingiraxo+15
Grafoman
14. 5. 2015   #18
-
0
-

#17 Matěj Andrle
však jsem v zásadě napsal to samí, co ted ty... :-)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Matěj Andrle+1
Grafoman
14. 5. 2015   #19
-
0
-

#18 ingiraxo
Nepřesouvám položky...

Nahlásit jako SPAM
IP: 78.136.161.–
Kit+15
Guru
14. 5. 2015   #20
-
0
-

#17 Matěj Andrle
Tohle si můžeš dovolit v low-level programování, ale v OOP to nemá co pohledávat, protože tvé řešení závislé na implementaci seznamu. A takové skryté závislosti se mohou škaredě vymstít.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
14. 5. 2015   #21
-
0
-

#20 Kit
O jak ty se tuze mýlíš. Implementoval jsem generickou třídu i jednu abstraktní - obě dokonale dodržely OOP a přitom umožnily rovnocenné funkčnosti a to bez toliko vysokých nároků. Dokonce ona abstraktní třída se dala implementovat mimo listy a pole - na přetížené metody atp.

Nahlásit jako SPAM
IP: 78.136.161.–
Kit+15
Guru
14. 5. 2015   #22
-
0
-

#21 Matěj Andrle
Stačí seznam implementovat jako spojový seznam (LinkedList) a jsi se svým algoritmem v háji.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
14. 5. 2015   #23
-
+1
-
Zajímavé

#12 End
Pokud chceš údaje vypsat v obráceném pořadí, než v jakém vkládáš, můžeš místo array použít kolekci Stack.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ingiraxo+15
Grafoman
14. 5. 2015   #24
-
0
-

#17 Matěj Andrle
asi nechápu jaký přesouvání položek myslíš.. pokud odeberu posílání indexu a stavu, tak logicky je to totožný s tím, co si napsal ty... pokud myslíš přesouvání z callbacku ven, tak to tady nehraje žádnou roli

for (int i = arr.Count - 1; i >= 0; i--) {
    callback(arr[i]);
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
End
~ Anonymní uživatel
49 příspěvků
19. 5. 2015   #25
-
0
-

No, chlapy vy jste se teda do toho dali... Některý kody jsou na mne zatím high level.

O co mi jde a k čemu směroval dotaz bylo, projít položky a když některá splní podmínku, tak ji smazat. Když půjdu od 0 ke .Count tak vznikne problem s přetečením v indexaci. Tak jsem si myslel, že by to šlo obráceně, od .Count k nule, kdy případné smazání by problém (teoreticky) neměl být a chyba v indexaci by neměla (nemůže) nastat. No asi to tedy v C# tak jednoduše nejde.

Nahlásit jako SPAM
IP: 89.102.247.–
P
~ Anonymní uživatel
212 příspěvků
19. 5. 2015   #26
-
0
-

Presne takhle - od Count k 0 - se to pri mazani prvku z kolekce dela. Pres foreach tohle nejde.

V prispevku #12 jsi se ale ptal na neco uplne jineho.

Nahlásit jako SPAM
IP: 85.93.116.–
ingiraxo+15
Grafoman
19. 5. 2015   #27
-
0
-

#25 End
no pokud budes procházet prvky a před nosem si je z pole mazat, tak ti to přeteče vždy, pokud nebudeš snižovat index a je jedno jestli je to procházíš od začátku.nebo od konce a u iterace to ani nejde (v javě třeba ano) 

List<int> pole = new List<int>(new[] { 1, 2, 3, 4, 5, 6 });

for (int i = 0; i < pole.Count; i++) {
    if (pole[i] % 2 == 0) {
        pole.RemoveAt(i);
        // snizis index, protoze se prvky posunou o 1 index doleva,
        // takze projdes stejny index znovu
        i--;
    }
}

Doporučuju udělat něco více generickýho, aby se to dalo použít pro všechny typy a nebylo třeba vytvářet znova cykly... 

// pomocna metoda, pro filtrovani (odebirani) prvku z listu
public static void FilterList<T>(List<T> input, Func<T, bool> filter)
{
    if (input == null || filter == null) return;

    for (int i = 0; i < input.Count; i++) {
        if (filter(input[i])) {
            input.RemoveAt(i);
            i--;
        }
    }
}

// nejaky list
List<int> pole = new List<int>(new[] { 1, 2, 3, 4, 5, 6 });

// ukazka pouziti.. pokud jakykoliv logicky vyraz
// (v tomhle pripade) "item % 2 == 0" bude True, tak prvek odebere
FilterList(pole, item => item % 2 == 0);
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
P
~ Anonymní uživatel
212 příspěvků
Budaun
~ Anonymní uživatel
1 příspěvek
27. 9. 2015   #29
-
0
-

Sahaswan

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 107.167.108.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 23 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý