gpt4 book ai didi

c# - 修改 C# 字典值

转载 作者:太空狗 更新时间:2023-10-29 22:20:56 25 4
gpt4 key购买 nike

我是 C++ 专家,但对 C# 完全不是。我创建了一个 Dictionary<string, STATS> , 其中STATS是一个简单的 struct .一旦我用初始 string 建立了字典和 STATS对,我想修改字典的STATS值(value)。在 C++ 中,它非常清楚:

Dictionary<string, STATS*> benchmarks;
Initialize it...

STATS* stats = benchmarks[item.Key];
// Touch stats directly

但是,我在 C# 中这样尝试过:

Dictionary<string, STATS> benchmarks = new Dictionary<string, STATS>();

// Initialize benchmarks with a bunch of STATS
foreach (var item in _data)
benchmarks.Add(item.app_name, item);

foreach (KeyValuePair<string, STATS> item in benchmarks)
{
// I want to modify STATS value inside of benchmarks dictionary.
STATS stat_item = benchmarks[item.Key];
ParseOutputFile("foo", ref stat_item);

// But, not modified in benchmarks... stat_item is just a copy.
}

这是一个非常新手的问题,但找到答案并不容易。

编辑:我也试过如下:

  STATS stat_item = benchmarks[item.Key];
ParseOutputFile(file_name, ref stat_item);
benchmarks[item.Key] = stat_item;

但是,我得到了异常,因为这样的操作会使字典无效:

Unhandled Exception: System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()
at helper.Program.Main(String[] args) in D:\dev\\helper\Program.cs:line 75

最佳答案

如果您的 STATS 确实是一个 struct,这意味着它是一个值类型,那么您在哪里执行此操作:

STATS stat_item = benchmarks[item.Key];
ParseOutputFile("foo", ref stat_item);

您的 stat_item 是位于 benchmarks[item.Key] 的值的副本。因此,当您将它作为 ref 参数传递给 ParseOutputFile 时,只有 copy 被修改。

在您发布的 C++ 代码中,请注意,您将通过使用指针来执行您想在此处完成的操作。

对于 .NET,解决方案很简单:将 STATS 更改为引用类型(class 而不是 struct)。那么您的本地 stat_item 变量将是对 benchmarks[item.Key] 的值引用的同一对象的引用。

关于c# - 修改 C# 字典值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2437691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com