将字典的所有值除以一个值
Dividing all values of a dictionary by a value
我在 C# 中有以下代码,其中 vector 是 Dictionary.I 的 [string,double] 类型,想要将此字典中的所有值除以一个值 "magnitude"。现在,我天真的第一个代码如下:
foreach (var key in vector.Keys)
{
vector[key] = vector[key] / magnitude;
}
抛出异常,说Collection在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 迭代:
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);
我在 C# 中有以下代码,其中 vector 是 Dictionary.I 的 [string,double] 类型,想要将此字典中的所有值除以一个值 "magnitude"。现在,我天真的第一个代码如下:
foreach (var key in vector.Keys)
{
vector[key] = vector[key] / magnitude;
}
抛出异常,说Collection在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 迭代:
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);