将字典的所有值除以一个值

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);