我正在创建一个整数集类,其中对象最多可以通过布尔数组保存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;
}
答案 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的类,并且然后在unionSet
和isEqual
中使用此功能。例如,见question,KeyValuePair
代表想象的Pair
。这可能是老师的要求,也可能是一种矫枉过正。取决于老师。
答案 3 :(得分:1)
您可以使用以下结构替换每个for循环:
int counter = 0;
foreach(bool b in set)
{
set[counter] = true;
counter++;
}
另外,请注意,bool[] table = new bool[10];
的所有值都设置为false
,因为false
是bool类型的默认值。