replace dictionary value at key using linq
本问题已经有最佳答案,请猛点这里访问。
编辑:我不觉得这是重复的-我没有清楚地阐述我想知道一个有效的方法,以填补char的左边我的字典值。我标记为答案的问题应该澄清,因为它是一个与其他线索中的答案非常不同的答案。对不起,我说错了。
我正在尝试验证字典中的所有值是否都有一定的长度,如果没有,请在左侧填充"0"。我知道"什么"的问题,我正在阅读字典的kvp,然后修改它,这当然会引发一个异常,但我不知道如何修改我的代码使其"合法"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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; } } } |
break;阻止代码抛出错误,但也会使其在从foreach循环中中断时不会传递其他值。
结果应该是:
1 2 3 | 0000123456 0000000678 0000000013 |
使用
1 | foreach(KeyValuePair<string,string> k in d.ToList()) |
而不是
1 | foreach(KeyValuePair<string,string> k in d) |
这将创建一个键值对列表,然后通过该列表进行迭代。这意味着在循环中你可以触摸字典。
如果您不介意创建一个新的字典,那么您也可以很容易地使用LINQ替换字典。
1 | d = d.ToDictionary(x => x.Key, x => x.Value.PadLeft(10, '0')); |
使用for循环而不是foreach循环。这将允许您遍历字典,并在同一步骤中对其进行修改。
编辑:在进一步的谷歌搜索/试图通过字典编译for循环时,似乎您实际上无法做到这一点。我在C中找到了修改字典中的键的方法,似乎在不删除键的情况下甚至无法更改键。所以这个问题也许对你有帮助。
这应该是一条线的技巧
1 | Dictionary<string, string> result = d.ToDictionary(p => p.Key,p=> p.Value.PadLeft(10, '0')); |
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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'); } } |
使用for循环而不是foreach。在foreach中,您不能修改集合(在您的care d中),因为您正在迭代它