gpt4 book ai didi

c# - 修改字典中的结构变量

转载 作者:IT王子 更新时间:2023-10-29 04:06:14 27 4
gpt4 key购买 nike

我有一个这样的结构:

public struct MapTile
{
public int bgAnimation;
public int bgFrame;
}

但是当我用 foreach 遍历它来改变动画帧时我做不到...

代码如下:

foreach (KeyValuePair<string, MapTile> tile in tilesData)
{
if (tilesData[tile.Key].bgFrame >= tilesData[tile.Key].bgAnimation)
{
tilesData[tile.Key].bgFrame = 0;
}
else
{
tilesData[tile.Key].bgFrame++;
}
}

它给了我编译错误:

Error 1 Cannot modify the return value of 'System.Collections.Generic.Dictionary<string,Warudo.MapTile>.this[string]' because it is not a variable
Error 2 Cannot modify the return value of 'System.Collections.Generic.Dictionary<string,Warudo.MapTile>.this[string]' because it is not a variable

为什么我不能更改字典中结构中的值?

最佳答案

索引器将返回值的副本。对该副本进行更改不会对字典中的值做任何事情……编译器会阻止您编写有缺陷的代码。如果你想修改字典中的值,你需要使用类似的东西:

// Note: copying the contents to start with as you can't modify a collection
// while iterating over it
foreach (KeyValuePair<string, MapTile> pair in tilesData.ToList())
{
MapTile tile = pair.Value;
tile.bgFrame = tile.bgFrame >= tile.bgAnimation ? 0 : tile.bgFrame + 1;
tilesData[pair.Key] = tile;
}

请注意,这也是避免无缘无故地进行多次查找,而您的原始代码正在这样做。

我个人强烈建议反对开始使用可变结构,请注意......

当然,另一种选择是将其设为引用类型,此时您可以使用:

// If MapTile is a reference type...
// No need to copy anything this time; we're not changing the value in the
// dictionary, which is just a reference. Also, we don't care about the
// key this time.
foreach (MapTile tile in tilesData.Values)
{
tile.bgFrame = tile.bgFrame >= tile.bgAnimation ? 0 : tile.bgFrame + 1;
}

关于c# - 修改字典中的结构变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6255305/

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