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

本文关键字:一个 字典 | 更新日期: 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);