1

我有一个以 Pr_Matrix 命名的 ConcurrentDictionary:

ConcurrentDictionary<int, ConcurrentDictionary<int, float>> Pr_Matrix = new ConcurrentDictionary<int, ConcurrentDictionary<int, float>>();

以下代码的目的是将data_set.Set_of_Point数据集中每对点之间的相似度值添加到该字典中。

foreach (var point_1 in data_set.Set_of_Point)
{
   foreach (var point_2 in data_set.Set_of_Point)
   {
       int point_id_1 = point_1.Key;
       int point_id_2 = point_2.Key;
       float similarity = selected_similarity_measure(point_1.Value, point_2.Value);

       Pr_Matrix.AddOrUpdate(point_id_1, 
       new ConcurrentDictionary<int, float>() { Keys = {  point_id_2 }, Values = { similarity } }, 
       (x, y) => y.AddOrUpdate(point_id_2, similarity, (m, n) => n));
   }
}

我无法更新存在于主 ConcurrentDictionary 中的 ConcurrentDictionarys。

4

1 回答 1

1

第一个问题是AddOrUpdate方法返回一个Float数据类型。您必须明确返回ConcurrentDictionary :

  Pr_Matrix.AddOrUpdate(point_id_1, new ConcurrentDictionary<int, float>() { Keys = { point_id_2 }, Values = { similarity } }

                        , (x, y) => { y.AddOrUpdate(point_id_2, similarity, (m, n) => n); return y; });

第二个问题是KeysValues集合是只读的并且ConcurrentDictionary不支持Collection Initializer ,因此您必须使用Dictionary之类的东西对其进行初始化:

Pr_Matrix.AddOrUpdate(
    point_id_1, 
    new ConcurrentDictionary<int, float>(new Dictionary<int, float> {{point_id_2, similarity}} ), 
    (x, y) => { y.AddOrUpdate(point_id_2, similarity, (m, n) => n); return y; }
);
于 2012-09-16T14:04:47.880 回答