1

我的代码是这样的:

Dictionary<string, string> specialCharacters = new Dictionary<string, string>();
            specialCharacters.Add("@", "%");
            specialCharacters.Add("*", "^");

List<Action<Employee>> listOfDel = new List<Action<Employee>>();

foreach (KeyValuePair<string, string> character in specialCharacters)

{

Action<Employee> replace = (empData) => empData.EmpName =          empData.EmpName.ToString().Replace(character.Key, character.Value);

listOfDel.Add(replace);

//listOfDel.Add(new Action<Employee>((empData) => empData.EmpName = empData.EmpName.ToString().Replace(character.Key, character.Value)));

}     

问题是列表 listOfDel 具有相同的操作,因为它引用了相同的函数替换,它取最后一对 character.Key, character.Value ((" ", "^") 我想要一个在列表中具有不同操作的结果动作 listOfDel ,其中每个方法将具有不同的值。("@", "%"), (" ", "^"); 我还尝试创建一个新的动作委托实例并将其用作匿名方法。请查看注释代码,但问题仍未解决。

4

1 回答 1

0

问题是您正在捕获迭代器变量。循环只声明了一个变量,因此当您执行委托时,它们都将使用相同的值(它们都引用同一个委托)。对于 C# 4 及更早版本,您只需创建一个副本:foreach

foreach (KeyValuePair<string, string> character in specialCharacters)  
{
    var copy = character;
    Action<Employee> replace = empData => empData.EmpName =    
         empData.EmpName.ToString().Replace(copy.Key, copy.Value);

    listOfDel.Add(replace);    
}

C# 5 将使这变得不必要,因为foreach将被修复,以便就匿名函数而言,每次迭代都有一个单独的变量。

有关详细信息,请参阅 Eric Lippert 的博客文章“关闭被认为有害的循环变量”

于 2012-06-03T16:01:52.933 回答