1

我正在创建一个整数集类,其中对象可以通过一个布尔数组保存多达 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

4 回答 4

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);
}
于 2013-02-23T01:10:32.693 回答
2

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

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

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

于 2013-02-23T01:14:50.533 回答
1

第一个 for 循环不能用 foreach 代替,因为无法更改 foreach 循环中的元素。

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

理论上,您可以使用Zip(可从 .NET 4 获得)或创建一个返回的函数IEnumerable<Pair<int,int>>,其中Pair是一个仅包含两个值的类,然后在两者中使用此函数unionSetisEqual. 例如看这个问题,用KeyValuePair代表想象Pair。这可能是老师要求的,也可能是矫枉过正。取决于老师。

于 2013-02-23T01:18:19.303 回答
1

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

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

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

于 2013-02-23T01:19:31.620 回答