2011-04-23 17 views
0

我想改进一个列表集合,我必须替换可被2和10整除的值,并用dTwo替换可由2整除的所有值,用dTen替换10可以整除的值。用单词替换数字的列表集合

我的代码适用于一个可分割的声明,但不是两个。

 var num = new List<string>(); 

     for (int n = 0; n < 101; n++) 
     { 
      num.Add(n % 2 == 0 ? "dTwo" : n.ToString()); 
      num.Add(n % 10 == 0 ? "dTen" : n.ToString()); 
     } 
+0

那个代码有什么问题?你不想为两个都可以划分的东西添加两个条目,即20? – Ben 2011-04-23 16:28:14

回答

1

由于任何数字,是由10整除也能被2整除你必须选择你的另外陈述,并与下一个号码继续,如果你有一个数被10整除:

var num = new List<string>(); 

    for (int n = 0; n < 101; n++) 
    { 
     if(n % 10 == 0) 
     { 
      num.Add("dTen"); 
     } 
     else num.Add(n % 2 == 0 ? "dTwo" : n.ToString()); 
    } 
+0

如果我没有弄错,那永远不会执行'n%2'测试。您的样本中“continue”无条件运行。 – 2011-04-23 16:27:09

+0

也许我误解了这个问题,但是那总是会忽略可分两检,不是吗? – Ben 2011-04-23 16:27:24

+0

@yea在编辑中看到了doh! – BrokenGlass 2011-04-23 16:27:35

1

如果我可以尝试避免使用实际循环的已定义结构的外侧的循环控制,即。如果可以的话,我更喜欢避免使用continue,这有点像使用goto陈述。对于这种情况,我会采用简单易懂的方法,我认为这种方法可读性强,维护简单,虽然稍微冗长一些。

可以切换的if/else,如果在需要语句来更改优先级,在这种情况下,n % 10有优先顺序

var num = new List<string>(); 
for (int n = 0; n < 101; ++n) 
{ 
    if (n % 10 == 0) 
    { 
    num.Add("dTen"); 
    } 
    else if (n % 2 == 0) 
    { 
    num.Add("dTwo"); 
    } 
    else 
    { 
    num.Add(n.ToString()); 
    } 
} 
+0

+1你说得对,我不知道我在想什么;-)这应该是被接受的答案。 – BrokenGlass 2011-04-23 17:00:22

+0

Nitpick,但是可以被10整除? ;) – 2011-04-23 17:20:15

0

有两种方法我会采取在这里,首先是详细,但传达你想在一个非常可读的方式做的:

var num = new List<string>(101); 
for (int i = 0; i < 101 ; i++) 
{ 
    if (i == 0) 
    { 
     num.Add(i.ToString()); 
    } 
    else if (i % 10 == 0) 
    { 
     num.Add("dTen"); 
    } 
    else if (i % 2 == 0) 
    { 
     num.Add("dTwo"); 
    } 
    else 
    { 
     num.Add(i.ToString()); 
    } 
} 

第二个采用了更简洁的LINQ-Y型的方法,像这样。

var num = Enumerable.Range(0, 101) 
    .Select(
     n => n == 0 ? n.ToString() : 
     n % 10 == 0 ? "dTen" : 
     n % 2 == 0 ? "dTwo" : 
     n.ToString()) 
    .ToList(); 

请注意,我也考虑到了0边缘的情况下,其中0否则将得到报告为整除10

你去哪个对,很大程度上取决于你的口味。就我个人而言,我会去执行后者,因为它很简洁,但仍然表达了代码的意图。我刚刚完成的一些非常基本的测试显示,它的执行速度也会更快。