2012-07-29 70 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); 
     } 
}