Diskuze: Porovnání Listu vlastního datového typu
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 14 zpráv z 14.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Vždyť to funguje... Přepsal sis Equals? Aspoň nějak tahkle?
public override bool Equals(object obj)
{
var clovek = (Clovek)obj;
if (clovek == null)
return false;
return (Jmeno.Equals(clovek.Jmeno) &&
Prijmeni.Equals(clovek.Prijmeni) &&
Vek.Equals(clovek.Vek));
}
Popřípadě můžeš použít komparátor a extension metody:
class MyClass : IEqualityComparer<Clovek>
{
public bool Equals(Clovek x, Clovek y)
{
return (x.Jmeno.Equals(y.Jmeno) &&
x.Prijmeni.Equals(y.Prijmeni) &&
x.Vek.Equals(y.Vek));
}
public int GetHashCode(Clovek obj)
{
return ((obj.Jmeno.GetHashCode() & obj.Prijmeni.GetHashCode()) ^ obj.Vek) * 19;
}
}
foreach (var item in clovek_01.Except(clovek_02, new MyClass()))
{
Console.WriteLine($"{item.Jmeno} {item.Prijmeni}");
}
Já k Honzovi přidám trochu omáčky. To kouzlo je v porovnávání referenčních typů. Ten porovnávací stroj ve výchozím stavu porovnáva odkazy v paměti. Tedy
var clovek_1 = new Clovek()
{
Jmeno = "Marek",
Prijmeni = "Novak",
Vek = 30
}
a toto
var clovek_2 = new Clovek()
{
Jmeno = "Marek",
Prijmeni = "Novak",
Vek = 30
}
Jsou dva různé objekty protože sedí na různých adresách v paměti. Aby to fungovalo jak jsi predpokládal je potřeba tomu porovnávacímu stroji dodat nový "předpis" či "klíč" podle kterého má porovnávat. Honza ti popsal jeden způsob. Kdyby ses kouknul na dokumentaci ke Contains, tak tam to je taktéž popsané.
Ahoj, ještě bych se chtěl zeptat, proč se musí přepisovat GetHashCode() a proč zrovna takto?
return ((obj.Jmeno.GetHashCode() & obj.Prijmeni.GetHashCode()) ^ obj.Vek) * 19;
Díky za případné vysvětlení.
Protože je rychlejší spočítat hash a pak v případě shody ověřit jestli jsou fakt ty objekty shodne.
Tak mi řekni jiný důvod, proč bys měl mít u každého objektu GetHashCode(). Jsem zvědav.
To s tím nesouvisí. Já jenom říkám, že počítání hashe je poměrně náročná činnost oproti porovnání.
Ahoj, ještě dotaz, jak to ošetřím, když bude některá hodnota null (třeba Jmeno nebo Vek) ?
On má svý, způsobem pravdu.. GetHashCode použivají některé kolekce (například dictionary) aby si mohli "pobalíčkovat" objekty a tak zrychlit hledání.
To že je počítání hashe náročné je nesmysl. Vždy záleží na implementaci. Ten hash si můžu klidně dát konstantní a bude to v O(1).
Pokud mám dva objekty které jsou téměř stejné - liší se třeba jen v jedné propertě, budou mít na základě "nepřesné" GetHashCode metody stejnou hodnotu.. POkud tedy tento objekt umístím do Dictionary mezi 1000000 zcela rozdílných objektů a potom se zeptám, jestli se tam nachází "ten druhý" objekt. On si spošte HashCode a pak se koukne u sebe "do přihrádky", kde má jen instanc s tímto HashCodem.. v našem případě je třeba pouze 1.. Nemusí tedy prohledávat více objektů, ale jen mezi těmi co mají stejný HashCode.
Je potřeba číst více slov ... nejenom jedno
Tady je kód pro výpis těch kteří nejsou v kolekci clovek1:
foreach(Clovek clovek in clovek1.Where(s=>clovek2.forEach(b=>b != s)).Select(s=>s))
{
Console.WriteLine(+"jmeno: "+clovek.Jmeno+"\nprijimeni: "+clovek.Prijimeni+"\nvek: "+clovek.Vek);
}
Pokud chceš porovnávat jména stačí udělat toto:
foreach(Clovek clovek in clovek1.Where(s=>clovek2.forEach(b=>b.Jmeno != s.Jmeno)).Select(s=>s))
{
Console.WriteLine(+"jmeno: "+clovek.Jmeno+"\nprijimeni: "+clovek.Prijimeni+"\nvek: "+clovek.Vek);
}
To nadtím je špatně...
foreach (Clovek clovek in clovek1.Where(s=>!clovek2.Contains(s)))
{
Console.WriteLine(+"jmeno: " + clovek.Jmeno + "\nprijimeni: " + clovek.Prijimeni + "\nvek: " + clovek.Vek);
}
A pokud chceš porovnávat třeba jména tak
foreach (Clovek clovek in clovek1.Where(s=>!clovek2.Any(d=>d.Jmeno==s.Jmeno)))
{
Console.WriteLine(+"jmeno: " + clovek.Jmeno + "\nprijimeni: " + clovek.Prijimeni + "\nvek: " + clovek.Vek);
}
Zobrazeno 14 zpráv z 14.