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.