使用Dictionary的正确方法

时间:2012-06-22 08:04:39

标签: c# dictionary

这里我有一段代码,显示了我想如何更新字典中的值的示例。 我不认为这是最好的方法,因为我不确定它是否是线程安全的。

编辑:它只是POC代码,我的意思是将Keys复制到数组然后在Dictionary上做东西。我不能在这里发布我的雇主的代码,所以我做了一个例子来说明问题。

当我将Keys复制到数组时,我可能会在代码的其他部分使用Dictionary引用,其中可能会添加一些键,然后这样的函数不会更新所有键,因为我在某些时候复制了这些键时间我应该是子类还是包装字典并使用锁对其进行操作,还是有简单的方法?

我应该如何以正确的方式更新值?

    static void Main(string[] args)
    {
     Dictionary<string, int> dic = new Dictionary<string, int>();

     dic.Add("Kej1",0);
     dic.Add("Kej2",1);
     dic.Add("Kej3", 3);
     dic.Add("Kej4", 3);

     String[] arr = new string[dic.Count] ;
     dic.Keys.CopyTo(arr,0);

    foreach (var va in arr)
    {
        Console.WriteLine(dic[va] + " " + va);
        dic[va] = 10;
        Console.WriteLine(dic[va] + " " + va);
    }
    Console.ReadKey();
    }

3 个答案:

答案 0 :(得分:3)

如果您想从.NET 4开始使用线程安全字典,可以使用ConcurrentDictionary

答案 1 :(得分:0)

您目前的实施情况很好。您的

 Dictionary<string, int> dic = new Dictionary<string, int>(); 

是一个局部变量,它只由主线程引用。你不需要担心线程安全。

如果您确实想要使其成为线程安全的,那么您可以通过这种方式锁定字典:

static void Main(string[] args) 
{ 
  Dictionary<string, int> dic = new Dictionary<string, int>(); 

  lock(dic)
  {
   dic.Add("Kej1",0); 
   dic.Add("Kej2",1); 
   dic.Add("Kej3", 3); 
   dic.Add("Kej4", 3); 

   String[] arr = new string[dic.Count] ; 
   dic.Keys.CopyTo(arr,0);

   foreach (var va in arr) 
   { 
     Console.WriteLine(dic[va] + " " + va); 
     dic[va] = 10; 
     Console.WriteLine(dic[va] + " " + va); 
   } 
  } 
  Console.ReadKey(); 
} 

答案 2 :(得分:0)

如果您实际使用多个线程,则只需要担心线程安全。大多数时候你不知不觉地做到了。所以,不要担心它,并以任何你想要的方式访问你的字典。

如果您使用任何带有&#34; async&#34;或者&#34;开始&#34;在其中,您可能需要重新考虑这一点。