C# 正确使用词典

C# 正确使用词典,c#,dictionary,C#,Dictionary,这里我有一段代码,展示了如何更新字典中的值。 我不认为这是最好的方法,因为我不确定它是否是线程安全的 编辑:这只是POC代码,我的意思是将密钥复制到数组中,然后在字典中进行操作。伙计们,我不能在这里发布我雇主的代码,所以我举了个例子来说明这一点 当我将键的副本复制到数组中时,我可能在代码的其他部分使用字典引用,其中可能会添加一些键,然后这样的函数不会更新所有键,因为我在某个时间点复制了这些键。我应该子类化还是包装字典并用锁对其进行操作,还是有更简单的方法 我应该如何以适当的方式更新这些值

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

编辑:这只是POC代码,我的意思是将密钥复制到数组中,然后在字典中进行操作。伙计们,我不能在这里发布我雇主的代码,所以我举了个例子来说明这一点

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

我应该如何以适当的方式更新这些值

    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();
    }
static void Main(字符串[]args)
{
Dictionary dic=新字典();
dic.添加(“Kej1”,0);
dic.添加(“Kej2”,1);
dic.添加(“Kej3”,3);
dic.添加(“Kej4”,3);
字符串[]arr=新字符串[dic.Count];
dic.Keys.CopyTo(arr,0);
foreach(arr中的var va)
{
控制台写入线(dic[va]+“”+va);
dic[va]=10;
控制台写入线(dic[va]+“”+va);
}
Console.ReadKey();
}

如果您想要一个从.NET 4开始的线程安全字典,您可以使用。

您当前的实现很好。你的

 Dictionary<string, int> dic = new Dictionary<string, int>(); 
Dictionary dic=newdictionary();
是一个局部变量,仅由主线程引用。您不需要担心线程安全性

如果您确实希望使其线程安全,则可以通过以下方式锁定字典:

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(); 
} 
static void Main(字符串[]args)
{ 
Dictionary dic=新字典();
锁(dic)
{
dic.添加(“Kej1”,0);
dic.添加(“Kej2”,1);
dic.添加(“Kej3”,3);
dic.添加(“Kej4”,3);
字符串[]arr=新字符串[dic.Count];
dic.Keys.CopyTo(arr,0);
foreach(arr中的var va)
{ 
控制台写入线(dic[va]+“”+va);
dic[va]=10;
控制台写入线(dic[va]+“”+va);
} 
} 
Console.ReadKey();
} 

如果实际使用多个线程,则只需担心线程安全。大多数时候,你不能在不知不觉中这样做。所以不用担心,你可以用任何方式访问你的字典


如果您使用任何包含“async”或“Begin”字样的内容,您可能需要重新考虑这一点。

不知道这个示例应该显示什么。您提到了多个线程,但示例中没有。尝试改写您的问题。这看起来像一个控制台应用程序。您的代码中没有多个线程。@Jon我已经更新了描述,它只是POC代码,需要一些想象力,我不能在这里发布“不是我的代码”。是的,您可以,但这有一些您已经习惯的意外行为(例如,add可能不会成功)-在大多数情况下是一个带有
lock(dict){…}的普通字典
这项工作做得好吗?它是否允许我更新字典的值,如上面的示例所示,由于枚举中断,我无法在不将键复制到数组的情况下更新值?我将用并发字典测试一些。这是我的第一个想法,但我想用可能最好的方式来做,现在看来是这样。