2013-02-23 35 views
1

我正在創建一個整數集類,其中對象可以通過布爾數組容納101個數字。我的任務是儘可能使用foreach循環,但我無法找到一個可以使用它的地方,甚至可以使用它。何時/如何用foreach替換for循環

下面是我的代碼的一些片段,我按照老師的要求完成了該程序。如果甚至有可能,我無法弄清楚聯合設置爲foreach循環。這個程序是否可以通過foreach循環來改進,如果有,在哪裏?

public bool[] set = new bool[101]; 

public IntegerSet(){ 

    for (int k = 0; k < set.Length; k++) 
    { 
     set[k] = false; 
    } 

public IntegerSet unionSet (IntegerSet a) 
{ 
    IntegerSet c = new IntegerSet(); 
    for (int i = 0; i < 101; i++) 

    { 
     if (a.set[i] == true || this.set[i] == true) 
      c.set[i] = true; 
    } 

    return c; 
} 

public bool isEqual(IntegerSet a) 
{ 
    int count = 0; 
    for (int i = 0; i < 101; i++) 
    { 
     if (a.set[i] == this.set[i]) 
      count++; 
    } 
    if (count == 101) 
     return true; 
    else 
     return false; 
} 
+0

什麼是'set'? – 2013-02-23 00:52:15

+0

'public bool [] set = new bool [101];' – krikara 2013-02-23 00:52:49

+0

與您的問題沒有直接關係,但您的isEqual方法可以變得更高效。無需計算好匹配的數量 - 只要您找到錯誤匹配,就立即返回false。 – siger 2013-02-23 00:57:19

回答

6

一般情況下,當你處理一個集合無需修改它使用情況下,一個foreach循環。在有多個集合的情況下,使用索引的循環更合適。

在你的情況下,沒有三個環的配合上述的說明:

  • 第一回路寫入陣列
  • 第二和第三循環處理多個序列。

您可以簡化您的代碼不少,但每當你使用兩組,一for循環是比較合適的(我假設使用LINQ不是一個選項)。

public IntegerSet unionSet (IntegerSet other) { 
    IntegerSet res = new IntegerSet(); 
    for (int i = 0; i < 101; i++) { 
     res.set[i] = other.set[i] || this.set[i]; 
    return res; 
} 
public bool isEqual(IntegerSet a) { 
    for (int i = 0; i < 101; i++) { 
    if (a.set[i] != this.set[i]) 
     return false; 
    return true; 
} 

只要是完整的,與LINQ的地方,你可以避開大部分的循環:拇指

public IntegerSet unionSet(IntegerSet other) { 
    // Assume that you have a constructor that takes IEnumerable<bool> 
    new IntegerSet(set.Zip(other.set, (a, b) => a || b)); 
} 
public bool isEqual(IntegerSet a) { 
    return set.SequenceEqual(a.set); 
} 
+0

不知道怎麼了在這裏downvotes。你的帖子是現貨。 – Quibblesome 2013-02-23 01:13:54

+0

保持冷靜...這只是一個**洞:D拿我的upvote! :D – 2013-02-23 01:14:02

+0

優秀的答案,這正是我所期待的:我們是否也可以修改集合。 – krikara 2013-02-23 01:41:54

2

簡單的規則可以幫助你:

使用循環數組和迭代器的foreach循環

所有的集合似乎都是數組所以你的循環使用(fors)是正確的。

1

第一個for循環無法用foreach替換,因爲無法更改foreach循環中的元素。

第二個和第三個循環不是很好的候選人,因爲foreach循環遍歷一個集合,但你需要它們遍歷兩個集合。

理論上你可以使用Zip(可從.NET 4中),或者創建一個返回IEnumerable<Pair<int,int>>,其中Pair是一個類,只是holds two values的功能,然後在這兩個unionSetisEqual使用此功能。例如見question,其中KeyValuePair代表想象的Pair。這可能是教師要求的,或者可能是一種矯枉過正。取決於教師。

+0

你的答案其實很好,但是我發現第一個參數有誤導性......我敢打賭我的房子我可以用* foreach *替換*。 – 2013-02-23 01:31:03

1

您可以用這種結構循環相互替換這些:

int counter = 0; 
foreach(bool b in set) 
{ 
    set[counter] = true; 
    counter++; 
} 

而且,記住,任何bool[] table = new bool[10];具有設置爲false所有值,作爲false是布爾類型的默認值。

+0

確實可以取代它,但這不會有所改進。另外,這個foreach看起來有點愚蠢:D – 2013-02-23 01:22:10

+0

我認爲這完全愚蠢,當我的老師看起來不合適時,我的老師想讓我這樣做。 – krikara 2013-02-23 01:25:13

+0

@krikara我認爲你有一位好老師......很高興知道* for *和* foreach之間的區別* – 2013-02-23 01:28:16