Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 作业不包括';t使用lambda表达式修改List ForEach函数中的变量_C#_Variables_Lambda_Variable Assignment - Fatal编程技术网

C# 作业不包括';t使用lambda表达式修改List ForEach函数中的变量

C# 作业不包括';t使用lambda表达式修改List ForEach函数中的变量,c#,variables,lambda,variable-assignment,C#,Variables,Lambda,Variable Assignment,我正在为我的家庭作业写一个简单的加密程序。我已经完成了,现在我正试图用lambda表达式改进我的代码。在lambda表达式之后,列表中的对象不会更改。它是否使用局部变量?我怎样才能用lambda表达式做到这一点。我写了下面的代码 public override string Encrypt(string code) { List<Byte> encodedBytes = new List<Byte>(ASCIIEncoding.ASCII.GetB

我正在为我的家庭作业写一个简单的加密程序。我已经完成了,现在我正试图用lambda表达式改进我的代码。在lambda表达式之后,列表中的对象不会更改。它是否使用局部变量?我怎样才能用lambda表达式做到这一点。我写了下面的代码

public override string Encrypt(string code)
    {
        List<Byte> encodedBytes = new List<Byte>(ASCIIEncoding.ASCII.GetBytes(code));

        encodedBytes.ForEach(o => { if (hash.Contains(o)) 
            o = hash.ElementAt((hash.IndexOf(o) + ShiftAmount) % hash.Count); });            

        return ASCIIEncoding.ASCII.GetString(encodedBytes.ToArray());                
    }
mylist.ModifyWhere(someBoolReturningFunction, someTReturningFunction);
public覆盖字符串加密(字符串代码)
{
List encodedBytes=新列表(ascienceoding.ASCII.GetBytes(code));
ForEach(o=>{if(hash.Contains(o))
o=hash.ElementAt((hash.IndexOf(o)+ShiftAmount)%hash.Count);});
返回ascienceoding.ASCII.GetString(encodedBytes.ToArray());
}

我在等你的答案,谢谢…

它确实使用了一个局部变量。如果希望lambda的返回值重新分配到列表中,请使用而不是ForEach。

是的,在代码中,变量“o”是传递给ForEach方法的匿名方法范围内的局部变量。对它的更改不会反映在该范围之外。

您可以编写自己的扩展方法来迭代列表,修改项目,然后根据lambda返回一个新列表,如下所示:

public static class Extensions
{
  public static List<T> ModifyEach<T>(this List<T> list, Func<T, T> method)
  {
    List<T> mod = new List<T>();

    foreach (T e in list)
    {
      mod.Add(method(e));
    }

    return mod;
  }
}
公共静态类扩展
{
公共静态列表ModifyEach(此列表,Func方法)
{
List mod=新列表();
foreach(在列表中)
{
修改增加(方法(e));
}
返回模式;
}
}
示例用法:

List<string> f = new List<string>()
{
  "hello",
  "world"
};

f = f.ModifyEach(x => x.ToUpper());
f.ForEach(x => Console.WriteLine(x));
List f=新列表()
{
“你好”,
“世界”
};
f=f.ModifyEach(x=>x.ToUpper());
f、 ForEach(x=>Console.WriteLine(x));

如果您需要与问题更相关的解决方案,这将更合适

public static class Extensions
{
    public static void ModifyWhere<T>(this List<T> list, Func<T, bool> condition, Func<T, T> act)
    {
        for (int i = 0; i < list.Count; i++)
        {
            if (condition(list[i]))
                list[i] = act(list[i]);
        }
    }
}

在这种情况下,向代码中添加Lambda表达式不会有多大改进。我认为Lambda表达式实际上降低了基于读取能力的代码质量。在这种情况下,标准的ForEach更具表现力。@markbyers:hash的类型是List,我尝试了HashSet,但它没有我需要的IndexOf方法@Metro Smurf:谢谢你的建议,你说得对,我强制使用.NET功能看起来很有趣:)谢谢你的回答,但我必须确保哈希在转换之前包含元素。你可以在转换表达式中这样做。@nepjua没有什么能阻止你这么做。这就是我要找的。谢谢你的回答。我不知道写那种东西,现在我知道了。谢谢。