我有一个通用字典,该字典在基于网格的游戏的地图中为每个坐标存储一个Tile定义。
Dictionary<IntVector2, Tile> tiles;
使用此设置可以随意调整地图的大小,因为只需添加新坐标即可,而无需更改其他任何内容。但是,我想将(0,0)坐标用作其他计算的地图枢轴,这要求我能够在创建地图后更改地图中心坐标。
是否有一种更干净,更高效的方式将字典中的所有值(Tile)移到新坐标,如有必要创建新键,然后删除所有未使用的键?
到目前为止,我有这个:
public void MovePivot(int xDelta, int yDelta)
{
// Copy my existing tile map.
Dictionary<IntVector2, Tile> tilesCopy = new Dictionary<IntVector2, Tile>(tiles);
// Initialize a new empty one.
tiles = new Dictionary<IntVector2, Tile>();
// Copy all old values into the new one, but shift each coordinate.
foreach (var tile in tilesCopy)
{
IntVector2 newKey = tile.Key + new IntVector2(xDelta, yDelta);
tiles.Add(newKey, tile.Value);
}
}
如果不复制我的词典,是否可以“就地”进行操作?
最佳答案
可以实现一种新的字典类型,该字典类型可以保留当前移位并在读/写期间执行移位。
用法示例:
AdjustableDictionary<int, string> map = new AdjustableDictionary<int, string>((key, adj) => key + adj);
这应该关闭。值与引用类型之间可能存在问题。
public class AdjustableDictionary<K, V>
{
public K CurrentAdjustment { get; set; }
public int Count { get { return _dictionary.Count; } }
public ICollection<K> Keys { get { return _dictionary.Keys.Select(k => AdjustKey(k)).ToList(); } }
private IDictionary<K, V> _dictionary;
private Func<K, K, K> _adjustKey;
public AdjustableDictionary(Func<K, K, K> keyAdjuster = null)
{
_dictionary = new Dictionary<K, V>();
_adjustKey = keyAdjuster;
}
public void Add(K key, V value)
{
_dictionary.Add(AdjustKey(key), value);
}
public bool ContainsKey(K key)
{
return _dictionary.ContainsKey(AdjustKey(key));
}
public bool Remove(K key)
{
return _dictionary.Remove(AdjustKey(key));
}
public bool TryGetValue(K key, out V value)
{
return _dictionary.TryGetValue(AdjustKey(key), out value);
}
public ICollection<V> Values { get { return _dictionary.Values; } }
public V this[K key] {
get {
return _dictionary[AdjustKey(key)];
}
set {
_dictionary[AdjustKey(key)] = value;
}
}
public void Clear()
{
_dictionary.Clear();
}
private K AdjustKey(K key)
{
return _adjustKey != null
? _adjustKey(key, CurrentAdjustment)
: key;
}
}
上面的代码主要是从VirtualDictionary answer修改而来的
关于c# - 将Dictionary的所有值移至新键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38317204/