如何更新C#中存储在Dictionary中的值?


455

如何更新字典中特定键的值Dictionary<string, int>


我有一个复杂的类型作为值存储在字典中。当我想更改存储值的属性时,得到CS1612。因此,我必须采取一种方法:var v = dict [c]; v.dprop = c.sprop; dict [c] = v;
peter70 '18

Answers:


762

只需指向给定键的字典并分配一个新值即可:

myDictionary[myKey] = myNewValue;

因此,这种简单的方法似乎也可以更好地替代众所周知的“ .Add”和“ .TryGetValue”方法,而无需更改该值。(?)至少,如果覆盖密钥没有关系,例如在不排除密钥在循环中多次写入的情况下。还是有人看到任何不利条件?尤其是因为.Add对于初学者来说很重要,如果忘记了if-wrapper或TryGetValue,它可以在测试以及其他测试数据中正常工作,对于同一键两次调用.Add,它将抛出异常。
Philm

1
该操作的有趣之处在于,它会将UPSERT(键,值)转换为字典。辉煌!
索伦

1
正如Pini所说,这应该是问题的答案。正确的事情,并改变它。
Leo Gurdian

190

通过访问密钥作为索引是可能的

例如:

Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary["test"] = 1;
dictionary["test"] += 1;
Console.WriteLine (dictionary["test"]); // will print 2

11
如果列表中没有项目“ test”,则list [“ test”] = list [“ test”] + 1; 将引发KeyNotFoundException!不存在的索引器的纯分配将起作用。list [“ test”] = 1;
史蒂文·斯皮尔卡

您还可以使用list [“ test”] ++;吗?
2016年

17
不要调用字典列表,将其称为狗或猫或字典
user3800527'3

1
@aufty您可以编写,++dictionary["test"];或者,dictionary["test"]++;但前提是字典中有一个键值为“ test”的条目—例如: if(dictionary.ContainsKey("test")) ++dictionary["test"]; else dictionary["test"] = 1; // create entry with key "test"
gerryLowry

46

您可以遵循以下方法:

void addOrUpdate(Dictionary<int, int> dic, int key, int newValue)
{
    int val;
    if (dic.TryGetValue(key, out val))
    {
        // yay, value exists!
        dic[key] = val + newValue;
    }
    else
    {
        // darn, lets add the value
        dic.Add(key, newValue);
    }
}

您在这里获得的优势是,只需1次访问字典即可检查并获取相应键的值。如果ContainsKey用于检查是否存在并使用来更新值,dic[key] = val + newValue;那么您将两次访问字典。


4
代替dic.Add(key, newValue);您可以使用use dic[key] = newvalue;
Macke 2015年

如果您执行“ dic [key] = value”并且“ key”不存在会怎样?
superpuccio

1
@superpuccio,您会收到KeyNotFoundException
ntroncos 2015年

8
@ntroncos不正确,它将使用提供的值将该键添加到字典中。+ =不适用于不存在的键,因为它只是dic [key] = value + dic [key]的语法糖。
lastas 2015年

2
这应该是该问题的答案,因为它涉及到更新字典而不只是添加字典。
寂寞的编码者2016年

15

使用LINQ:访问字典的密钥并更改值

Dictionary<string, int> dict = new Dictionary<string, int>();
dict = dict.ToDictionary(kvp => kvp.Key, kvp => kvp.Value + 1);

我什至不知道它是如何工作的,但真是太神奇了
六角形的图形,2015年

1
对于这样简单的事情,创建另一本字典对我来说没有任何意义。检查calcalboni的答案。
RollerCosta'2

1
我认为这是一个很好的答案。它不需要您知道每个键字符串
Joseph Wu

9

这是一种通过索引更新的方式,就像foo[x] = 9在哪里x是键,而9是值

var views = new Dictionary<string, bool>();

foreach (var g in grantMasks)
{
    string m = g.ToString();
    for (int i = 0; i <= m.Length; i++)
    {
        views[views.ElementAt(i).Key] = m[i].Equals('1') ? true : false;
    }
}

13
m [i] .Equals('1')已计算为布尔值,因此添加?正确:不需要错误
Wessel van der Linden 2014年

我不知道这种逻辑的效率如何,但是我喜欢For循环的想法。:)
开放免费

2
  1. 更新 -仅修改现有内容。为了避免使用索引器的副作用:

    int val;
    if (dic.TryGetValue(key, out val))
    {
        // key exist
        dic[key] = val;
    }
  2. 更新或(如果dic中不存在值,则添加新的)

    dic[key] = val;

    例如:

    d["Two"] = 2; // adds to dictionary because "two" not already present
    d["Two"] = 22; // updates dictionary because "two" is now present

1

这可能对您有用:

方案1:原始类型

string keyToMatchInDict = "x";
int newValToAdd = 1;
Dictionary<string,int> dictToUpdate = new Dictionary<string,int>{"x",1};

if(!dictToUpdate.ContainsKey(keyToMatchInDict))
   dictToUpdate.Add(keyToMatchInDict ,newValToAdd );
else
   dictToUpdate[keyToMatchInDict] = newValToAdd; //or you can do operations such as ...dictToUpdate[keyToMatchInDict] += newValToAdd;

方案2:我将列表用作值的方法

int keyToMatch = 1;
AnyObject objInValueListToAdd = new AnyObject("something for the Ctor")
Dictionary<int,List<AnyObject> dictToUpdate = new Dictionary<int,List<AnyObject>(); //imagine this dict got initialized before with valid Keys and Values...

if(!dictToUpdate.ContainsKey(keyToMatch))
   dictToUpdate.Add(keyToMatch,new List<AnyObject>{objInValueListToAdd});
else
   dictToUpdate[keyToMatch] = objInValueListToAdd;

希望它对需要帮助的人有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.