我有一个Dictionary<string,int>
,我只想将字典中的值减一。
我有这个,但不确定它是否是最好的做法。
foreach (KeyValuePair<string, int> i in EPCs)
{
EPCs[i.Key] = i.Value - 1;
}
更新:我尝试递减该值的原因是该值是与位置相关的索引号。当我从字典中删除某些内容时,我必须减少字典中的索引号。可能有更好的方法。
答案 0 :(得分:5)
现有代码是减少字典中所有值的完全合适的方法。
如果要创建新词典,可以使用LINQ:
EPCs = EPCs.ToDictionary(p => p.Key, p => p.Value - 1);
但是,这将创建一个完全新的 Dictionary<string, int>
实例,而不是修改现有实例。但是,既然你用linq
标记了你的问题,我想我会提供一种方式(我知道)LINQ可以解决你的问题。
答案 1 :(得分:2)
我认为这是完全合适的。
但是既然你问过这个问题,你对此类代码的关注可能不合理吗?
你应该意识到你有两个选择来做你正在寻找的事情:
您可以使用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>).
如果你需要使用其他东西来获得高性能,那么从长远来看,字典可能是更好的选择。