簡體   English   中英

如何突破遞歸調用

[英]How to break out recursive call

如何分解遞歸如下:

調用GetDirectory("D:\\Engine\\", "102")

預期輸出:D:\\ Engine \\ Type \\ Tone_Id_102
當前,輸出為null。

非常感謝。

private static string GetDirectory(string folderPath, string number)
{
    foreach (string directory in Directory.GetDirectories(folderPath))
    {
        if (directory.Contains(number))
        {
            return directory;
        }

        GetDirectory(directory, number);
    }

    return null;
}

做起來會不會更容易更好

return Directory.EnumerateDirectories(
        folderPath,
        "*",
        SearchOption.AllDirectories)
    .FirstOrDefault(s => s.Contains(number))

或@TimSchmelter建議,

return Directory.EnumerateDirectories(
        folderPath,
        string.Format("*{0}*", number),
        SearchOption.AllDirectories)
    .FirstOrDefault()

我認為您只需要return

return GetDirectory(directory, number);

但是,這將迭代foreach一個條目,因此會更好:

private static string GetDirectory(string folderPath, string number)
{
    foreach (string directory in Directory.GetDirectories(folderPath))
    {
        if (directory.Contains(number))
        {
            return directory;
        }

        string result = GetDirectory(directory, number);

        if (!string.IsNullOrEmpty(result))
        {
            return result;
        }
    }

    return null;
}

應該這樣做:

private static string GetDirectory(string folderPath, string number)
{
    foreach (string directory in Directory.GetDirectories(folderPath))
    {
        if (directory.Contains(number))
            return directory;

        var innerDir = GetDirectory(directory, number);
        if (innerDir != null)
            return innerDir;
    }

    return null;
}

這做同樣的事情,我認為它更具可讀性:

Directory.GetDirectories(folderPath, "*.*", SearchOption.AllDirectories)
         .FirstOrDefault(x => x.Contains(number));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM