0

を行う値を求めたがConcurrentDictionaryから選択します。私は作成して埋め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()); 
    } 

} 

次のようになります。

a
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(); 

最初の値は値を返しますが、2番目の値は返しません。何が間違っていますか?

この

は、値を追加するために使用するコードです:

  _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 )新しいMyTest(1、1、 "ovpSOMEVALUEValue")、新しいMyTest(1,2、 "ocpSOMEVALUEValue")、(key、value)=>値=新しいリスト() );正規辞書の場合:_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; 
     } 
    } 
関連する問題