簡體   English   中英

使用嵌套方法進行Void to String方法轉換

[英]Void to String method conversion with nested methods

    public void Print() {
        Print(root, 4);
    }

    private void Print(Node node, int padding) {
        if (node != null) {
            if (node.rChild != null) {
                Print(node.rChild, padding + 4);
            }
            if (padding > 0) {
                Console.Write(" ".PadLeft(padding));
            }
            if (node.rChild != null) {
                Console.Write("/\n");
                Console.Write(" ".PadLeft(padding));
            }
            Console.Write(node.value.ToString() + "\n ");
            if (node.lChild != null) {
                Console.Write(" ".PadLeft(padding) + "\\\n");
                Print(node.lChild, padding + 4);
            }
        }
    }

此代碼在控制台中返回一個很好的格式日志。 如下

        6
     /
    5
     \
        4
 /
3
 \
    2
     \
        2

現在,當我將void轉換為字符串格式時,它變得凌亂,似乎無法正常工作。 因為我有嵌套方法。

所以我目前在從void到string的轉換中迷失了

因此,不希望打印出值,而是希望它將樹作為字符串返回。

好吧,要做到這一點,你只需要改變每個Console.Write方法調用,將你正在打印的字符串追加到一個大字符串,並且每個Print方法調用將Print的返回值附加到一個大字符串。 並在最后返回這個大字符串

基本上,想象一下“大字符串”就是控制台。

你可以使用StringBuilder類作為我正在談論的這個大字符串。 讓我們在print方法的開頭創建一個:

StringBuilder sb = new StringBuilder ();

現在我們需要尋找這兩種模式並進行更改。

我們改變:

Console.Write(XXX);

sb.Append(XXX);

並改變

Print(XXX, XXX);

sb.Append(Print(XXX, XXX))

現在該方法如下所示:

private string Print(Node node, int padding) {
    StringBuilder sb = new StringBuilder ();
    if (node != null) {
        if (node.rChild != null) {
            sb.Append(Print(node.rChild, padding + 4));
        }
        if (padding > 0) {
            sb.Append(" ".PadLeft(padding));
        }
        if (node.rChild != null) {
            sb.Append("/\n");
            sb.Append(" ".PadLeft(padding));
        }
        sb.Append(node.value.ToString() + "\n ");
        if (node.lChild != null) {
            sb.Append(" ".PadLeft(padding) + "\\\n");
            sb.Append(Print(node.lChild, padding + 4));
        }
    }
    return sb.ToString ();
}

在此之后,您應該能夠更改無參數的Print方法以自行返回字符串。

解決這個問題的簡明方法是:

  1. 使用條件語句替換每個if語句,該語句可以生成if語句中的內容或空字符串。
  2. 使用+所有部分組合在一起
  3. 返回結果

這會給你這個:

private string Print(Node node, int padding)
{
    if (node != null)
    {
        return 
            (node.rChild != null 
                ? Print(node.rChild, padding + 4) 
                : "") +
            (padding > 0 
                ? " ".PadLeft(padding) 
                : "") +
            (node.rChild != null 
                ? "/\n" + " ".PadLeft(padding) 
                : "") +
            node.value.ToString() + "\n " +
            (node.lChild != null 
                ? " ".PadLeft(padding) + "\\\n" + Print(node.lChild, padding + 4) 
                : "");
    }

    return "";
}

暫無
暫無

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

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