C# Dictionary<List<int>, double> a ContainsKey() – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C# Dictionary<List<int>, double> a ContainsKey() – .NET – Fórum – Programujte.comC# Dictionary<List<int>, double> a ContainsKey() – .NET – Fórum – Programujte.com

 

Petr
~ Anonymní uživatel
746 příspěvků
12. 3. 2011   #1
-
0
-

Ahoj,
mám vytvořen Dictionary<List<int>, double> mujSlovnik. Obsahuje jeden záznam typu klíč -> hodnota (List<int> kde je uložen jeden prvek (111) a desetinné číslo 0,5).

Vytvořím si teď nový list např. List<int> novyList = new List<int>(); a přidám do něj jeden prvek 111 - novyList.Add(111); a když se zeptám, zda-li je tento list obsažen ve slovníku mujSlovnik (výpis do konzole jasně říká, že ano, tak se mi vrací FALSE). Nechápu :-(



if (mujSlovnik.ContainsKey(novyList))
{
Console.WriteLine("TRUE");
}
else {Console.WriteLine("FALSE");}


Díky za rady...

Nahlásit jako SPAM
IP: 77.48.59.–
12. 3. 2011   #2
-
0
-

Ahoj,

je to způsobené tím, že dochází k porovnávání referencí. Abych to upřesnil, kolekce novyList ve slovníku není, ale je tam jiná kolekce, která shodou okolností obsahuje stejné hodnoty. V zásadě to lze řešit tak, že slovníku (Dictionary<>) řekneš, jakým způsobem má klíče (kolekce) porovnávat.

K tomu je nutné vytvořit implementaci rozhraní IEqualityComparer<T> http://msdn.microsoft.com/en-us/library/ms132151.aspx, kterou slovníku předáš v konstruktoru.

/// <summary>

/// Compares two sequences for equality.
/// </summary>
/// <typeparam name="T">The type of sequences.</typeparam>
public class EnumerableComparer<T> : IEqualityComparer<IEnumerable<T>>
{
/// <summary>
/// Determines whether the specified objects are equal.
/// </summary>
/// <param name="x">The first sequence to compare.</param>
/// <param name="y">The second sequence to compare.</param>
public bool Equals(IEnumerable<T> x, IEnumerable<T> y)
{
// k porovnání sekvencí stačí použít LINQ
return x.SequenceEqual(y);
}

/// <summary>
/// Returns a hash code for the specified object.
/// </summary>
/// <param name="seq">The sequence for which a hash code is to be returned.</param>
public int GetHashCode(IEnumerable<T> seq)
{
int hashCode = 0;

foreach (var item in seq)
{
hashCode ^= item.GetHashCode();
}

return hashCode;
}
}
Použití už je myslím jasné, ale pro jistotu.
var comparer = new EnumerableComparer<int>();

var dictionary = new Dictionary<List<int>, double>(comparer);
dictionary.Add(new List<int> { 111 }, 0.5);

Console.WriteLine(dictionary.ContainsKey(new List<int> { 111 }));
To by mělo být všechno. Teda alespoň doufám, že jsem to správně pochopil :)
Editoval djanosik: Doplnil jsem implementaci metody GetHashCode.

Nahlásit jako SPAM
IP: 89.203.157.–
Dušan Janošík | web: djanosik.cz, @djanosik
Petr
~ Anonymní uživatel
746 příspěvků
12. 3. 2011   #3
-
0
-

To djanosik : díky moc, pomohlo to :smile4:

Nahlásit jako SPAM
IP: 77.48.59.–
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, 30 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ý