【问题标题】:C# auto update variable in dictionary is possible?字典中的 C# 自动更新变量是可能的吗?
【发布时间】:2021-07-09 05:55:17
【问题描述】:

示例 I 使用此代码,但此代码不更改字典中的值 更改字典中的自动更新值是可能的吗?

Dictionary<string, string> dic = new Dictionary<string, string>();
private void DoWork()
{
        dic.Add("data", "example1");
        dic.Add("data2", "example2");
        if(dic.TryGetValue("data",out string c))
        {
            c = "Value Changed Good";
        }

        foreach (string s in dic.Values)
        {
            Console.WriteLine(s);
        }
}

例如这个代码输出是一个

example1
example2

但是值没有改变例如如果值改变了这个输出也随之改变了

Value Changed Good
example2

【问题讨论】:

  • if (dic.ContainsKey("data")) dic["data"] = "Value Changed Good";
  • @DmitryBychenko,这不是最理想的,因为它需要 2 次查找,对吧?
  • @Sinatr:在普通的Dictionary&lt;K, V&gt; 的情况下,我们没有UpdateIfExist 或类似的,并且必须执行2 查找(如果我们有一个好的散列,它不会那么昂贵)。如果是ConcurrentDictionary&lt;K, V&gt;,我们可以一次性修改

标签: c#


【解决方案1】:

如果您想更新收藏品,您可能应该使用Oliver's answer 中提供的解决方案。我猜这是最直接的方法。

如果您想在for-loop 中更新集合值时避免重复查找,您可以考虑将集合值包装在一个包装器对象中。它可能看起来像这样:

class Wrapper
{
    public string Value { get; set; }
}

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

private void DoWork()
{
    dic.Add("data", new Wrapper { Value = "example1" });
    dic.Add("data2", new Wrapper { Value = "example2" });

    if (dic.TryGetValue("data", out Wrapper c))
    {
        c.Value = "Value Changed Good";
    }

    foreach (Wrapper s in dic.Values)
    {
        Console.WriteLine(s.Value);
    }
}

但请注意,这也会带来额外的开销(尤其是从字典中读取值时)。它也可能会使您的代码更难阅读和理解。

【讨论】:

    【解决方案2】:

    如果您更改局部变量 c 的值,这不会影响字典中的值。

    要更新字典中的值,您可以执行以下操作:

    var key = "data";
    if(dic.TryGetValue(key,out string c))
    {
        c = "Value Changed Good";
        dic[key] = c;
    }
    

    【讨论】:

    • 这个答案对于正常的参考类型准确吗? (是的,我知道字符串是一个例外) 编辑:准确的意思,“这不会影响字典中的值”。我相信引用类型是可变的。
    • @JohnD 这对于所有引用类型都是准确的。如果为c 分配一个新值,这意味着c 指向内存中的一个新地址。存储在字典中的变量仍将指向内存中的旧地址。
    • Ty,我没有考虑到 out 参数是一个新的本地变量。
    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2020-05-18
    • 2018-05-12
    • 1970-01-01
    • 2021-02-20
    相关资源
    最近更新 更多