将字典的所有值除以一个值
本文关键字:一个 字典 | 更新日期: 2023-09-27 18:37:22
我在 C# 中有以下代码,其中 vector 是字典的 [string,double] 类型。我想将此字典中的所有值除以值"magnitude"。现在,我天真的第一段代码如下:
foreach (var key in vector.Keys)
{
vector[key] = vector[key] / magnitude;
}
这引发了一个异常,表示集合已在 foreach 中修改。我可以创建第二个字典来将结果值写入其中,但我不希望这样做。
有没有更简单的方法可以做到这一点,例如使用对所有字典值进行操作的方法,如下所示?
vector.Values().Aggreagate(), vector.Values().Average()
最简单的方法是在迭代之前复制键列表:
foreach (var key in vector.Keys.ToList())
{
vector[key] = vector[key] / magnitude;
}
或:
foreach (var entry in vector.ToList())
{
vector[entry.Key] = entry.Value / magnitude;
}
(这样可以避免双重查找,但当然会复制更多数据。
诚然,修改现有条目的值被视为阻止您继续迭代键的更改,这有点可惜。
另一种方法是将可变包装器类型作为值,然后您可以使用:
foreach (var wrapper in vector.Values)
{
wrapper.Value = wrapper.Value / 10;
}
这根本不会修改字典 - 只是字典引用的对象。在大多数情况下,我个人不会这样做,但这可能适合您。
这当然是因为您在迭代时正在修改字典。您可以尝试循环访问Keys
的副本,而不是实际的集合
foreach (var key in vector.Keys.ToList())
{
vector[key] = vector[key] / magnitude;
}
您可以通过按如下方式复制集合来避免更改集合。
var CopiedKeys = vector.Keys.ToList();
foreach (var key in CopiedKeys)
{
vector[key] = vector[key] / magnitude;
}
dictionary = dictionary.ToDictionary(x => x.Key, x => x.Value / magnitude);
另一种方法是使用增量迭代器
int magnitude = 2;
for (int index = 0; index < vector.Count; index++)
{
String key = vector.ElementAt(index).Key;
vector[key] = vector[key] / magnitude;
}
最简单的方法之一是使用普通进行迭代,如以下示例所示:
for (int i = 0; i < vector.Keys.Count; i++)
{
string key = vector.Keys.ElementAt(i);
vector[key] /= magnitude;
}
如果要使用 Linq 方法,可以使用以下代码:
vector=vector
.Select(x=> new KeyValuePair<string,double>(x.Key,x.Value/magnitude))
.ToDictionary( x=>x.Key,x=>x.Value);