У меня есть SortedDictionary
объявлен как таковой:Источник словарь Ключ не найден
SortedDictionary<MyObject,IMyInterface> dict = new SortedDictionary<MyObject,IMyInterface>();
Когда его заселена со значениями, если я беру любой ключ из словаря, а затем попытаться сослаться на него сразу же после того, как я получаю KeyNotFoundException
:
MyObject myObj = dict.Keys.First();
var value = dict[myObj]; // This line throws a KeyNotFoundException
Как я парить над словарем (после ошибки) с отладчиком, я могу ясно видеть один и тот же ключ, который я пытался ссылаться как на самом деле содержится в словаре. Я заполняю словарь, используя ReadOnlyCollection
из MyObjects
. Может, там что-то странное? Я попробовал переопределить оператора ==
и методы Equals
, чтобы получить явное сравнение, которое я хотел, но такой удачи не было. Это действительно не имеет значения, так как я фактически получаю ключ непосредственно от Dictionary
, затем запрашивая Dictionary
, используя тот же ключ. Я не могу понять, что вызывает это. Кто-нибудь видел это поведение?
РЕДАКТИРОВАТЬ 1
В наиважнейшей Equals
Я также перегружен (как МС рекомендует) GetHashCode
, а также. Вот реализация MyObject
для всех, кто интересуется:
public class MyObject
{
public string UserName { get; set;}
public UInt64 UserID { get; set;}
public override bool Equals(object obj)
{
if (obj == null || GetType()!= obj.GetType())
{
return false;
}
// Return true if the fields match:
return this.Equals((MyObject)obj);
}
public bool Equals(MyObject other)
{
// Return true if the fields match
return this.UserID == other.UserID;
}
public override int GetHashCode()
{
return (int)this.UserID;
}
public static bool operator ==(MyObject a, MyObject b)
{
// If both are null, or both are same instance, return true.
if (System.Object.ReferenceEquals(a, b))
{
return true;
}
// If one is null, but not both, return false.
if (((object)a == null) || ((object)b == null))
{
return false;
}
// Return true if the fields match:
return a.UserID == b.UserID
}
public static bool operator !=(MyObject a, MyObject b)
{
return !(a == b);
}
}
То, что я заметил, с отладкой, что если я быстро добавить часы (после того, как KeyNotFoundException
отбрасывается) для выражения:
dict.ElementAt(0).Key == value;
он возвращает истину , Как это может быть?
EDIT 2 Таким образом, проблема закончилась тем, что из-за SortedDictionary
(и Dictionary
а) не поточно-. Был фоновый поток, который выполнял некоторые операции над словарем, который, кажется, запускает курорт коллекции (добавление элементов в коллекцию сделает это). В то же время, когда словарь повторял значения, чтобы найти мой ключ, коллекция менялась, и она не находила мой ключ, даже если он был там.
Извините за всех, кто попросил ввести код на этот, я в настоящее время отлаживаю приложение, которое унаследовал, и я не понимал, что это происходит по временному фоновому потоку. Как таковой, я думал, что я скопировал и вставил весь соответствующий код, но я не понимал, что за всем, управляющим коллекцией, существует еще один поток.
Вам необходимо * переопределить * Equals (и GetHashCode), хотя вы также можете перегрузить его. Пожалуйста, покажите свой класс - вернее, короткую, но полную программу, демонстрирующую проблему. –
Чтобы быть ясным: вы наблюдали это впервые без переопределения/перегрузки Equals/==/GetHashCode? Потому что ошибочная реализация этого будет легким ответом. –
@JonSkeet - Ты прав, я неправильно напечатал. Я использовал _override_ методы 'Equals' (и' GetHashCode'). Я добавил соответствующий код. –