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通常、単一のコレクションを変更せずに処理する場合は、ループを使用します。複数のコレクションがある状況では、インデックスを使用したループがより適切です。

あなたの場合、3 つのループのいずれも上記の説明に適合しません。

  • 最初のループは配列に書き込みます
  • 2 番目と 3 番目のループは、複数のシーケンスを処理します。

コードをかなり単純化できますが、2 つのセットを使用する場合は常に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

foreach ループ内の要素を変更することはできないため、最初の for ループを foreach に置き換えることはできません。

foreach ループは 1 つのセットを通過するため、2 番目と 3 番目の for ループはあまり適した候補ではありませんが、両方のセットを通過する必要があります。

理論的には、Zip ( .NET 4 から利用可能) を使用するか、 を返す関数を作成することができます。たとえば、この質問を参照してください。これは教師が求めていることかもしれませんし、やり過ぎかもしれません。先生によります。IEnumerable<Pair<int,int>>PairunionSetisEqualKeyValuePairPair

于 2013-02-23T01:18:19.303 に答える
1

これらの各 for ループを次の構造に置き換えることができます。

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

また、bool[] table = new bool[10];すべての値が bool 型のデフォルト値であるためfalse、 any が に設定されていることに注意してください。false

于 2013-02-23T01:19:31.620 に答える