C# 作业不包括';t使用lambda表达式修改List ForEach函数中的变量
我正在为我的家庭作业写一个简单的加密程序。我已经完成了,现在我正试图用lambda表达式改进我的代码。在lambda表达式之后,列表中的对象不会更改。它是否使用局部变量?我怎样才能用lambda表达式做到这一点。我写了下面的代码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
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没有什么能阻止你这么做。这就是我要找的。谢谢你的回答。我不知道写那种东西,现在我知道了。谢谢。