关于C#:使用LINQ替换键处的字典值

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'));


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

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');
    }

}

ToList允许您修改字典。


使用for循环而不是foreach。在foreach中,您不能修改集合(在您的care d中),因为您正在迭代它