我想知道是否可以将此循环转换为lambda语句?我知道它可能是for或foreach循环,但它是一个正常的,简单的while循环:
while (path.Substring(path.Length - 4) != ".txt" || path.Substring(path.Length - 4) != ".xml")
{
Console.WriteLine("File not a .txt or .xml extension! Enter the file name:");
path = Console.ReadLine();
}
如果有可能,如何将这个循环转换为这样的lambda语句?
答案 0 :(得分:2)
鉴于对该问题的评论表明这不是关于lambdas,而是关于最小化代码,这里有一些小建议,以避免一些代码重复:
string[] validExtensions = { ".txt", ".xml" };
do
{
Console.WriteLine("Enter the file name:");
path = Console.ReadLine();
if (!validExtensions.Contains(Path.GetExtension(path)))
{
Console.Write("File not a .txt or .xml extension! ");
path = null;
}
}
while (path == null);
检查另一个扩展只需要将扩展添加到阵列,它不需要复制代码来确定扩展名。字符串"Enter the file name:"
只需出现一次,即使您希望第一个提示略有不同的消息。读取一行的代码也只需出现一次。
就个人而言,我说你所拥有的重复是如此之小以至于没有必要避免它,但是你可能会发现这很有用,例如,如果你需要允许三个以上的扩展,或者从其他一些扩展中读取单个函数调用不足的位置。
其他一些评论:
Console.ReadLine()
可以返回null
。就像您问题中的代码一样,此版本无法正确处理。".TXT"
作为文件扩展名吗?while
条件path.Substring(path.Length - 4) != ".txt" || path.Substring(path.Length - 4) != ".xml"
永远不会是假的。它可能是真的,或者它可能抛出异常,但循环永远不会正常终止。答案 1 :(得分:0)
如果您想为学习和学术目的而这样做:
Func<string[], string> getFile = (validExtensions) =>
{
string path = "";
while (!validExtensions.Contains(Path.GetExtension(path)))
{
Console.WriteLine("File not a .txt or .xml extension! Enter the file name:");
path = Console.ReadLine();
}
return path;
};
string path = getFile.Invoke(new string[]{ ".txt", ".xml" });
使用.Invoke(string[])
来调用它,传入所需的文件扩展名。
将其传递给方法,例如:
public string UseFunc(Func<string[], string> getFile, string[] validExtensions)
{
return getFile.Invoke(validExtensions);
}
string path = foo.UseFunc(getFile);