减去Dictionary中的所有int值

时间:2010-05-10 15:05:31

标签: c# .net linq generics .net-3.5

我有一个Dictionary<string,int>,我只想将字典中的值减一。

我有这个,但不确定它是否是最好的做法。

foreach (KeyValuePair<string, int> i in EPCs)
{
   EPCs[i.Key] = i.Value - 1;
}

更新:我尝试递减该值的原因是该值是与位置相关的索引号。当我从字典中删除某些内容时,我必须减少字典中的索引号。可能有更好的方法。

5 个答案:

答案 0 :(得分:5)

现有代码是减少字典中所有值的完全合适的方法。

如果要创建新词典,可以使用LINQ:

EPCs = EPCs.ToDictionary(p => p.Key, p => p.Value - 1);

但是,这将创建一个完全新的 Dictionary<string, int>实例,而不是修改现有实例。但是,既然你用linq标记了你的问题,我想我会提供一种方式(我知道)LINQ可以解决你的问题。

答案 1 :(得分:2)

我认为这是完全合适的。

但是既然你问过这个问题,你对此类代码的关注可能不合理吗?

你应该意识到你有两个选择来做你正在寻找的事情:

  1. 通过访问每个条目(您的代码所用的条目)或
  2. 来修改现有字典
  3. 使用您想要的计算值创建一个新字典。
  4. 您可以使用LINQ轻松完成第二步:

    var newDict = myDict.ToDictionary( kvp => kvp.Key, kvp => kvp.Value-1 );
    

答案 2 :(得分:2)

这不是一个直接的答案,但是不是为每个项目递减它,而是可以存储偏移量并在获取项目时动态减少它,无论是作为专门的类还是仅仅在代码中。

答案 3 :(得分:0)

你可以自己为每个枚举器写一个小动作,它会采取行动并在每个元素上执行它:

    public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
    {
        foreach (T element in source)
        {
            action(element);
        }
    }

像这样使用:

 EPCs.ForEach(x => EPCs[x.Key] = x.Value -1);

它并不比以前更清洁,但更紧凑。 Reactive Extensions在System.Interactive中有一个名为Do的类似运算符。

答案 4 :(得分:0)

根据具体情况(Dictionary<string,int>).

,您的代码完全没问题

如果你需要使用其他东西来获得高性能,那么从长远来看,字典可能是更好的选择。