何时/如何用foreach替换for循环

时间:2013-02-23 00:47:22

标签: c# foreach

我正在创建一个整数集类,其中对象最多可以通过布尔数组保存101个数字。我的任务是尽可能使用foreach循环,但我找不到一个可以使用它的地方/使用它的地方甚至是有意义的。

以下是我的代码的一些片段,我完全按照老师的要求完成了该程序。如果甚至可能的话,我无法弄清楚联合集成为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;
}

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

可能对您有帮助的简单经验法则:

  

对于数组使用for循环,对迭代器使用foreach循环

您的所有集合似乎都是数组,因此您的循环使用(fors)是正确的。

答案 2 :(得分:1)

第一个for循环不能用foreach替换,因为不可能在foreach循环中更改元素。

第二个和第三个for循环不是很好的候选者,因为foreach循环遍历一个集合,但是你需要它们遍历两个集合。

理论上你可以使用Zip(可从.NET 4获得)或创建一个返回IEnumerable<Pair<int,int>>的函数,其中Pair是一个只有holds two values的类,并且然后在unionSetisEqual中使用此功能。例如,见questionKeyValuePair代表想象的Pair。这可能是老师的要求,也可能是一种矫枉过正。取决于老师。

答案 3 :(得分:1)

您可以使用以下结构替换每个for循环:

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

另外,请注意,bool[] table = new bool[10];的所有值都设置为false,因为false是bool类型的默认值。