2013-10-06 63 views
1

我目前正在使用兩個不同的函數來遍歷數字列表以查找總和和特定值的程序。這裏是我已經實現單獨的功能沒有重複的代碼

class Program 
{ 
    static int i, sum; 
    static List<int> store = new List<int>(); 

    static void Main(string[] args) 
    { 


     for (i = 0; i < 100; i++) 
     { 
      store.Add(i); 
     } 

     i = 0; 
     TraverseList(); 
     Console.ReadLine(); 
    } 

    static void TraverseList() 
    { 
     while (i < store.Count) 
     { 
      FindValue(); 
      FindSum(); 
      i++; 
     } 

     Console.WriteLine("The sum is {0}", sum); 
    } 

    static void FindValue() 
    {   
     if (store[i] == 40) 
     { 
      Console.WriteLine("Value is 40"); 
     }     
    } 

    static void FindSum() 
    { 
     sum = sum + store[i]; 
    } 
} 

我想FindSum和FindValue分成兩個不同的功能,而不是叫他們TraverseList的代碼。有沒有做這件事,而在重複這兩個函數列表遍歷的通用代碼,因爲我在這裏做

class Program 
{ 
    static int i, sum; 
    static List<int> store = new List<int>(); 

    static void Main(string[] args) 
    { 


     for (i = 0; i < 100; i++) 
     { 
      store.Add(i); 
     } 

     i = 0; 
     FindValue(); 
     i = 0; 
     FindSum(); 

     Console.ReadLine(); 
    } 

    static void FindValue() 
    { 
     while (i < store.Count) 
     { 
      if (store[i] == 40) 
      { 
       Console.WriteLine("Value is 40"); 
      } 
      i++; 
     } 
    } 

    static void FindSum() 
    { 
     while (i < store.Count) 
     { 
      sum = sum + store[i]; 
      i++; 
     } 

     Console.WriteLine("The sum is {0}", sum); 
    } 
} 
+1

爲什麼不使用Linq? –

+2

這段代碼非常糟糕,最明顯的冒犯之處在於你的方法FindValue和FindSum無緣無故地使用隱藏參數('store'和'i')。絕對沒有必要這樣做。拋棄此代碼並重新開始。 – Jon

+2

@jon我是一名初學者,我一直在努力讓事情發揮作用,我甚至不知道隱藏的參數是什麼。我肯定會對此做一些研究。 – Pete

回答

1

要查找的一系列數字,您可以使用簡單的LINQ功能的總和的任何其他方式:

List<int> numbers = new List<int>(); 
int sum = numbers.Sum(); 

我不確定你的意思是找到一個值。如果你想檢查是否在一系列數字中的一個等於一定值時,你可以使用LINQ功能Any

int myValue = 40; 
bool hasMyValue = numbers.Any(i => i == myValue); 

它使用一個lambda表達式,集合中執行函數,並將每個元素到功能。該函數返回true或false來表示該元素與Any測試匹配。

相反,如果你想檢查序列中的許多號如何搭配一定值時,你可以改用Count功能,像這樣:

int numberOfMatches = numbers.Count(i => i == myValue); 
+0

不要調用lambda表達式參數'i' - 我認爲這是一種不好的做法。 OP不希望「任何」項目。 –

+0

FindSum()只是我期望實現的功能的一個示例。所以sum()不會幫助我。我擔心的是,如果我要添加更多的函數來操作列表,我最終會重複遍歷每個函數類似於FindSum()或FindValue()的列表遍歷。 – Pete

+0

@AjitPeter你將不得不更加具體地瞭解你正在尋求的關於如何實現它的建議。有一個無限量的事情,你可以做一個清單和大量的方法來解決每個問題。這聽起來像你擔心重複迭代代碼。這實際上只有一行代碼,如果你使用一個簡單的'for'或'foreach'循環。你可以進一步壓縮它的唯一方法是使用語法糖,就像我向你展示的LINQ語句。有機會你可以用它來解決95%的問題。 –

0

第一件事 - 我會用foreach代替while ,關於重複的代碼(假設你沒有使用Linq) - 我認爲它很好

Linq可以簡化你的代碼的味道:

var FindSum = store.Sum(); 
var FindValue = store.FindAll(x => x == 40); 
+0

'FindAll'?使用'Find'或'Exist'或'Any(Linq)'方法 –

+0

@SriramSakthivel - 不,看起來他想要所有的東西,看看他的代碼,找到第一個東西后不停止迭代。 –

+0

我想上面的linq實現只會幫助我處理這個特殊情況,但是我擔心的是爲將來添加的任何其他功能複製相同的代碼(列表遍歷)。 – Pete

0

我不能強調isum作爲類成員有多糟。特別是i。它會讓你的代碼非常脆弱,而且很難處理。嘗試使每種方法儘可能與代碼的其餘部分隔離開來。

嘗試這樣代替:

static void Main(string[] args) 
{ 
    List<int> store = new List<int>(); 

    for(int i = 0; i < 100; i++) 
     store.Add(i); 

    FindValue(store); 
    FindSum(store); 

    Console.ReadLine(); 
} 

static void FindValue(List<int> list) 
{ 
    for(int i = 0; i < list.Count; i++) 
    { 
     if(list[i] == 40) 
      Console.WriteLine("Value is 40"); 
    } 
} 

static void FindSum(List<int> list) 
{ 
    int sum = 0; 
    for(int i = 0; i < list.Count; i++) 
     sum += list[i]; 

    Console.WriteLine("The sum is {0}", sum); 
} 

這是完全正常(正常)複製的循環,它只是一個單行。你也可以在這裏使用foreach。

另外,無視每個人告訴你使用LINQ。你顯然是編程新手,你應該先學習基礎知識。

+0

我同意這裏的代碼甚至對於標準來說也是不錯的例子:)上面的例子只是我試圖實現的功能的概述。遍歷列表不只是一行代碼。我有大約50行代碼和3個函數,都使用遍歷函數。我認爲可能有更好的方法來做,而不是爲每個函數複製相同的50行代碼3次。 – Pete

+0

在這種情況下,有一個循環,然後將列表+索引傳遞給您的不同方法。我只是想強調,即使是一個例子,永遠不要重複使用'i',因爲你已經完成了,這對你不好! – Chris

+0

有沒有其他的方式可以做到,因爲我是初學者,所以我不知道。我認爲代碼重複不好。早些時候的一些評論說,重複代碼是可以的。 – Pete