使用linq替换键处的字典值
本文关键字:字典 linq 替换 使用 | 更新日期: 2023-09-27 18:05:02
编辑:我不觉得这是重复的-我确实没有详细说明我想知道一种有效的方法来填充char's到我的字典值的左边。我标记为答案的问题应该澄清,因为它是一个非常不同的答案,而不是在其他线程的答案。对不起,我写错了。
我试图验证我的字典中的所有值都是一定的长度,如果不是,则在左侧填充'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
使用
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'));
使用for循环代替foreach循环。这将允许您遍历字典并在同一时间内修改它。
编辑:在进一步的谷歌/试图通过字典编译一个for循环,似乎你不能真正做到这一点。我发现如何在c#中修改字典中的键,似乎你甚至不能在不删除它的情况下更改键。也许这个问题对你有帮助。
使用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
将允许你修改你的字典
这应该能在一行中起作用
Dictionary<string, string> result = d.ToDictionary(p => p.Key,p=> p.Value.PadLeft(10, '0'));
使用for循环代替foreach。在foreach中,您不能修改集合(在您的代码中),因为您正在对其进行迭代