我可以把它变成lambda声明吗?

时间:2014-02-06 11:39:15

标签: c# lambda while-loop

我想知道是否可以将此循环转换为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语句?

2 个答案:

答案 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);
相关问题