0

Сегодня я делаю некоторые тесты с ConcurrentDictionary и словарь:выбрать словарь находит значение, но выбрать из ConcurrentDictionary не

class MyTest 
{ 
    public int Row { get; private set; } 
    public int Col { get; private set; } 
    public string Value { get; private set; } 

    public MyTest(int row, int col, string value) 
    { 
     this.Col = col; 
     this.Row = row; 
     this.Value = value; 
    } 


    public override bool Equals(object obj) 
    { 
     MyTest other = obj as MyTest; 
     return base.Equals(other); 

    } 

    public override int GetHashCode() 
    { 
     return (Col.GetHashCode()^Row.GetHashCode()^Value.GetHashCode()); 
    } 

} 

Используя Entity выше я создал и заполнил ConcurrentDictionary и словарь, и попробовал код ниже:

ConcurrentDictionary<MyTest, List<MyTest>> _test = new ConcurrentDictionary<MyTest, List<MyTest>>(); 
    Dictionary<MyTest, List<MyTest>> _test2 = new Dictionary<MyTest, List<MyTest>>(); 

     MyTest dunno = _test.Values.AsParallel().Select(x => x.Find(a => a.Col == 1 && a.Row == 1)).FirstOrDefault(); 
     MyTest dunno2 = _test2.Values.AsParallel().Select(x => x.Find(a => a.Col == 1 && a.Row == 1)).FirstOrDefault(); 

Первый возвращает значение, но второе не то, что я делаю неправильно?

Это код, который используется для добавления значения:

  _test.AddOrUpdate(cell10, 
      new List<MyTest> 
      { 
       new MyTest(1, 1, "ovpSOMEVALUEValue"), 
       new MyTest(1, 2, "ocpSOMEVALUEValue") 
      }, 
      (key, value) => value = new List<MyTest>()); 

     _test2.Add(cell10, 
      new List<MyTest> 
      { 
       new MyTest(1, 1, "ovpSOMEVALUEValue"), 
       new MyTest(1, 2, "ocpSOMEVALUEValue") 
      } 
      ); 
+0

Пожалуйста, разместите код, который используется для добавления значений в словари. –

+0

_test.AddOrUpdate (cell10, new List {new MyTest (1, 1, "ovpSOMEVALUEValue"), новый MyTest (1, 2, "ocpSOMEVALUEValue")}, (ключ, значение) => значение = новый Список ()); И для регулярного словаря: _test2.Add (cell10, new List {new MyTest (1, 1, "ovpSOMEVALUEValue"), новый MyTest (1, 2, "ocpSOMEVALUEValue")}); –

ответ

3

Вы звоните AddOrUpdate, и ваш третий параметр является то, что он должен создать новый пустой список, таким образом, результатом является то, что вы в конечном итоге с пустой список. Я предполагаю, что где-то перед этой строкой кода вы добавляете запись с тем же ключом.

Также обратите внимание, что функция Equals неверна. Вы сравниваете ссылки, а не фактические значения, которые вы используете в GetHashCode. Я предлагаю использовать шаблон по умолчанию для переопределения. Равные значения:

 protected bool Equals(x other) { 
     return Row == other.Row && Col == other.Col && string.Equals(Value, other.Value); 
    } 

    public override bool Equals(object obj) 
    { 
     if (ReferenceEquals(null, obj)) return false; 
     if (ReferenceEquals(this, obj)) return true; 
     if (obj.GetType() != this.GetType()) return false; 
     return Equals((x) obj); 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      var hashCode = Row; 
      hashCode = (hashCode*397)^Col; 
      hashCode = (hashCode*397)^(Value != null ? Value.GetHashCode() : 0); 
      return hashCode; 
     } 
    }