2012-07-29 68 views
-1

我想通過使用下面的語句得到一個字符串(str),它的作品,但任何建議來制定這種控制? ,因爲count可以是「n」。如何簡化此C#代碼?

if (a.count== 0) 
{ 
    str += a.Name; 
} 
    else if (a.count== 1) 
{ 
    str += a.Parent.Name + "/" + a.Name; 
} 
else if (a.count== 2) 
{ 
    str += a.Parent.Parent.Name + "/" + a.Parent.Name + "/" + a.Name; 
} 
else if (a.count== 3) 
{ 
    str += a.Parent.Parent.Parent.Name + "/" +a.Parent.Parent.Name + "/" + a.Parent.Name + "/" + a.Name; 
} 
. 
. 
. 
else if(a.count = n) 
{ 
     //n times.. 
} 
+1

「配方」是什麼意思?這不是一個標準的短語。 – Oded 2012-07-29 20:59:59

+0

你應該看看「循環」,或嘗試數字「遞歸性」 – 2012-07-29 21:00:12

+0

我的意思是,我可以使用遞歸函數或任何循環使它在較少的代碼行中(: – 2012-07-29 21:01:35

回答

4

類似以下(但你需要發揮它,使其工作):

int count = a.count; 
var current = a; 
for (int i = 0; i <= count; i++) 
{ 
    str += (i > 0 ? "/" : string.empty) + current.Name; 
    current = current.Parent; 
} 

有明顯的是很多角落案例,你需要考慮。

+0

我會嘗試,它看起來很酷:) – 2012-07-29 21:06:52

+0

在一個循環中連接字符串是一個壞主意,你應該使用StringBuilder代替。另外,這不是按照錯誤的順序組合的嗎? – svick 2012-07-29 21:37:01

+0

@svick完全同意。這就是爲什麼我寫道它不是代碼的最終版本,而只是一個想法。有很大的改進空間,其中之一是字符串連接部分。 – 2012-07-30 12:36:54

0

您可以使用此:

object unknownparent; 
for(int i = 0; i< n; i++) 
{ 
unknownparent = a.Parent; 
    for(int j = i; j<n; j++) 
    { 
     unknownparent = ((typeofa)unknownparent).Parent; 
    } 

    str += ((typeofa)unknownparent).Parent.Name + "/"; 

} 
str += a.Name; 
+0

Sergiu,這是行不通的。注意問題中的代碼如何根據控件祖先的名字構建字符串。 – 2012-07-29 21:04:29

+0

我想爲a.Parent而言,我不得不在內部再使用一個,不是嗎? – 2012-07-29 21:04:31

+0

我修改了答案... – 2012-07-29 21:26:30

1

我會

  • 在返回本身和它的父層次
  • 與LINQ選擇名稱的類型,來創建一個枚舉 - 特性
  • 反向()結果
  • 使用的string.join與斜線以創建串
+0

這可以是最好的方法,但它似乎真的很難對我來說,至少今天..但thanx快速回復flq .. – 2012-07-29 21:23:55

2

也許如果你停止時,父母爲null, 計數是沒有必要,我認爲使用Path.Combine是更優雅:)

var node = a; 
while (node != null) { 
    str = Path.Combine(node.Name, str); 
    node = node.Parent; 
} 

,或者您可以使用擴展方法來計算它爲你:

public static class Extension { 

     public static string GetFullPath(this YourNodeType node) 
     { 
      return (node.Parent == null) 
      ? node.Name 
      : Path.Combine(node.Parent.GetFullPath(), node.Name); 
     } 
}