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

33 浏览
0 Comments

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

如何为字典Dictionary 中的特定键更新值?

0
0 Comments

在C#中更新存储在字典中的值的问题是因为需要在字典中更新键对应的值,而不仅仅是添加新的键值对。解决这个问题的方法是使用TryGetValue方法来检查键是否存在,并根据情况更新值或添加新的键值对。

以下是一种解决方法的示例代码:

void addOrUpdate(Dictionary dic, int key, int newValue)
{
    int val;
    if (dic.TryGetValue(key, out val))
    {
        // 键存在,更新值
        dic[key] = val + newValue;
    }
    else
    {
        // 键不存在,添加新的键值对
        dic.Add(key, newValue);
    }
}

这种方法的优势在于只需要一次访问字典,就可以检查和获取对应键的值。如果使用ContainsKey方法来检查键是否存在,并使用dic[key] = val + newValue来更新值,则需要两次访问字典。

在更新值时,可以使用dic[key] = newValue;来替代dic.Add(key, newValue);。

如果执行"dic[key] = value",而键"key"不存在,会发生什么情况呢?

会抛出KeyNotFoundException异常吗?

事实上,它会将该键添加到字典中,并使用提供的值作为其值。但是,如果键不存在,使用+=运算符将不起作用,因为它只是dic[key] = value + dic[key]的语法糖。

以上解决方法应该是关于如何更新字典而不仅仅是添加新键值对的答案。

根据问题的要求,这是最佳答案。问题是关于如何更新值,而不是设置值。因此,这是最佳答案。

这篇文章是解决我问题的关键,我同意它是最好的答案。我不是在for或foreach循环中,我需要在一个大列表中找到一个值并在找到时更新它 - 只需使用TryGetValue来设置值,然后更新它 - 这正是我需要做的。对我来说非常完美,这是我从未遇到过的罕见情况。

更简洁的写法是:

int val = 0;
dic.TryGetValue(key, out val);
dic[key] = val + newValue;

没有建议OP想要将传递的值添加到键的任何现有值中;更有可能是希望覆盖它。因此,你只需要:

dic[key] = newValue;

...这可以是方法的全部内容。

0
0 Comments

在C#中,我们可以通过访问字典中的键来更新存储在字典中的值。如果要更新的键已经存在于字典中,我们可以直接使用索引对其进行赋值,例如:

Dictionary dictionary = new Dictionary();
dictionary["test"] = 1;
dictionary["test"] += 1;
Console.WriteLine(dictionary["test"]); // 输出2

但是,如果要更新的键在字典中不存在,那么使用索引赋值的方式将会引发KeyNotFoundException异常。在这种情况下,我们可以先判断字典中是否存在该键,如果存在则进行递增操作,如果不存在则创建一个新的键值对并将值设为1,示例如下:

if(dictionary.ContainsKey("test"))
    ++dictionary["test"];
else
    dictionary["test"] = 1;

除此之外,我们还可以使用++运算符对字典中的值进行递增操作,示例如下:

++dictionary["test"];

或者

dictionary["test"]++;

但是这种方式只适用于在字典中存在该键的情况,如果键不存在,使用++运算符将会引发KeyNotFoundException异常。因此,在使用++运算符之前,我们仍然需要先判断字典中是否存在该键。

0
0 Comments

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

在C#中,更新字典中存储的值非常简单。只需要指向给定键的字典,并分配一个新的值即可。这种方法似乎也是对众所周知的“.Add”和“.TryGetValue”方法的更好替代,而无需改变值。(?)至少,如果在循环中写入键可能会写入多次的情况下,这种方法是可行的。或者是否有人看到任何缺点?特别是因为.Add对于初学者来说有一个陷阱,如果忘记if包装器或TryGetValue,它在测试和其他测试数据中可以正常工作,但如果对同一个键调用两次.Add,它将抛出一个异常。

这个操作的有趣之处在于,它将(键,值)更新到字典中。太棒了!

正如Pini所说,这应该是问题的答案。做正确的事情并进行更改。

然而,这种方法的一个巨大缺点是,它被视为修改整个字典,换句话说,它不仅仅是一个更新

你确定吗?为什么这会修改“整个字典”?你有关于你所说的内容的参考吗?当然,这是字典上的一个运算符,调用一个方法也会做完全相同的事情...

如果这样迭代并进行操作,如何处理“Collection was modified; enumeration operation may not execute”?

var dict = new Dictionary() {
    { "a", 0 },
    { "b", 0 },
};
foreach (var key in dict.Keys)
    dict[key] = 1;
}

如果它只是一个对的更新,那么在迭代时就不会出现异常,因为表面上看,一个与另一个无关。

啊,我明白你的意思了,我误解了你所说的“修改整个字典”,你指的是它会使任何当前的迭代器无效,对吗?

是的,不幸的是,尽管表面上键没有被修改,但字典仍然把它视为已修改的集合。

当迭代并进行此操作时,如何处理“Collection was modified; enumeration operation may not execute”?

0