使用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

使用linq替换键处的字典值

使用

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中,您不能修改集合(在您的代码中),因为您正在对其进行迭代