使用linq替换key处的字典值

时间:2014-05-23 13:34:42

标签: c# dictionary

编辑:我不认为这是重复的 - 我没有清楚地说明我想知道一种有效的方法来填充字典值左侧的字符。我标记为答案的问题应该澄清,因为它是一个非常不同的答案,而不是其他主题的答案。对不起,我说错了。

我正在尝试验证我的词典中的所有值都是一定的长度,如果不是,请在左侧填充“0”。我知道“问题是什么”,我正在阅读字典的KVP,然后修改它当然会引发异常,但我不知道如何修改我的代码使其“合法”

class prefixMe
{
    Dictionary<string, string> d = new Dictionary<string, string>();

    public prefixMe()
    {
        d.Add("one", "123456");
        d.Add("two", "678");
        d.Add("three", "13");

        foreach(KeyValuePair<string,string> k in d)
        {
            StringBuilder sb = new StringBuilder(k.Value);
            while(sb.Length != 10)
            {
                Console.WriteLine("Key:{0}\tValue:{1}", k.Key, sb);
                sb.Insert(0, '0');
            }
            d[k.Key] = sb.ToString();
            //k.Value.Replace(k.Value, sb.ToString());// = sb.ToString();
            Console.WriteLine("Key:{0}\tNew Value:{1}", k.Key, d[k.Key]);
            break;
        }

    }
}

休息;停止代码抛出错误,但也使得它不会通过其他值,因为它突破了foreach循环。

结果应为:

0000123456
0000000678
0000000013

5 个答案:

答案 0 :(得分:6)

使用

foreach(KeyValuePair<string,string> k in d.ToList())

而不是

foreach(KeyValuePair<string,string> k in d)

这将创建一个键值对列表,然后通过该列表进行迭代。这意味着在循环中你可以触摸字典。

如果您不介意创建新词典,那么您也可以使用Linq轻松替换词典。

d = d.ToDictionary(x => x.Key, x => x.Value.PadLeft(10, '0'));

答案 1 :(得分:2)

使用for循环而不是foreach循环。这将允许您遍历Dictionary并在同一个go中修改它。

编辑:进一步谷歌搜索/尝试通过字典编译for循环,似乎你实际上不能这样做。我找到了How to modify key in a dictionary in C#,似乎你甚至无法在不删除密钥的情况下更改密钥。所以也许这个问题会对你有所帮助。

答案 2 :(得分:1)

使用PadLeft方法,不要在第一次迭代时中断循环。

public prefixMe()
{
    d.Add("one", "123456");
    d.Add("two", "678");
    d.Add("three", "13");

    foreach(var k in d.ToList())
    {
        if(k.Value.Length != 10) 
          d[k.Key]  = k.Value.PadLeft(10, '0');
    }

}

ToList将允许您修改字典。

答案 3 :(得分:1)

这应该是一行

Dictionary<string, string> result = d.ToDictionary(p => p.Key,p=> p.Value.PadLeft(10, '0'));

答案 4 :(得分:-1)

使用for循环而不是foreach。在foreach中,您无法修改集合(在您的护理中),因为您正在迭代它