我正在为我的作业写一个简单的加密。我已经完成了,现在我正在尝试使用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());
}
我在等你的回答,谢谢...
答案 0 :(得分:2)
确实使用了局部变量。如果您希望将lambda的返回值分配回列表,请使用ConvertAll而不是ForEach。
答案 1 :(得分:0)
是的,在您的代码中,变量“o”是传递给ForEach方法的匿名方法范围内的局部变量。对它的更改不会反映在该范围之外。
答案 2 :(得分:0)
您可以编写自己的扩展方法来迭代列表,修改项目,然后根据您的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;
}
}
样本用法:
List<string> f = new List<string>()
{
"hello",
"world"
};
f = f.ModifyEach(x => x.ToUpper());
f.ForEach(x => Console.WriteLine(x));
答案 3 :(得分:0)
如果您想要更多与问题相关的解决方案,这将更合适
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]);
}
}
}
并且这个解决方案不具体,方法是将bool返回函数作为条件,并将函数作为动作返回。
将使用示例用法
mylist.ModifyWhere(someBoolReturningFunction, someTReturningFunction);