2011-04-23 18 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

你去哪個對,很大程度上取決於你的口味。就我個人而言,我會去執行後者,因爲它很簡潔,但仍然表達了代碼的意圖。我剛剛完成的一些非常基本的測試顯示,它的執行速度也會更快。