1

私が持っているオブジェクトで:

public IEnumerable<voiture> recup_voitures()
{
    foreach (voiture v in _arrVCollection)
    {
        yield return (v);
    }
}

voiture構造体であり_arrVCollection、いくつかの構造体ボアチュールを含む配列です。

私のメインクラスには次のものがあります:

 foreach (CarCollection.voiture o in collection.recup_voitures())
 {
     //some code to display the content of each struct
 }

何が起こっているのかというと、長さ 5 の配列があり、その中に struct voiture が 1 つしかない場合、表示コードが 1 回ではなく 5 回実行されるということです。何が間違っていますか?

4

2 に答える 2

5

たとえば5の長さの構造体の配列を作成している場合、配列にはデフォルトのコンストラクターを使用して構築された5つの構造体が含まれることを意味します。

voiture[] arr = new voiture[5];
arr[0] = some_non-default_voiture;

その場合、配列にはデフォルト以外のインスタンスが1つとデフォルトのvoitureインスタンスが4つ含まれます。

voitureインスタンスを1つだけ取得するには、長さ1の配列を作成するか、次を使用しList<T>ます。

List<voiture> = new List<voiture> { new voiture() };

本当に長さ5の配列を処理する必要がある場合は、null許容型の使用を検討してください。

voiture?[] _arrVCollection = new voiture?[5];
_arrVCollection[0] = new voiture();

そして、次のように列挙します。

public IEnumerable<voiture> recup_voitures()
{
    foreach (voiture? v in _arrVCollection)
    {   if (v.HasValue)
            yield return v.Value;
    }
}

編集:

Servyが述べたように、メソッドrecup_voitures()はlinqで書き直すことができます。

public IEnumerable<voiture> recup_voitures()
{
    return _arrVCollection.Where(x => x.HasValue).Select(x => x.Value);
}
于 2012-11-04T15:47:24.803 に答える
0

現在のコードでは、例外が発生します。

クラスになるrecup_voitures場合は、メソッドでコードを変更できます。voiture

 public static IEnumerable<voiture> recup_voitures()
        {
            foreach (voiture v in _arrVCollection)
            {
                if (v != null)
                    yield return (v);
            }
        }
于 2012-11-04T15:51:34.567 に答える