2

C ++では、fillを使用して配列(および他の同様のコンテナー)の値の範囲を設定できます。

例えば、

fill(number, number+n,10);

上記のコードは、配列番号の最初のn個の値を値10に設定します。

これに相当する最も近いC#は何ですか。

4

3 に答える 3

4

同等の方法はありませんが、同様のコードを書く方法はたくさんあります

Linq-to-Objectsクラスのメソッドは、リストの初期化に使用できるシーケンスを作成できますが、これはC++での実際の動作とは大きく異なります。

new List<char>(Enumerable.Repeat('A', 10));
new List<int>(Enumerable.Range(1, 10));

C ++は、C ++テンプレートがどのように機能するかによって、これらのことをより一般的に実現できます。C#の単純な型制約は役立ちますが、同じ柔軟性は提供されません。

于 2011-08-05T10:33:39.467 に答える
4

存在するかどうかはわかりませんが、独自のコードを簡単に作成できます。

void Fill<T>(T[] array, int start, int count, T value)
{
  for (int i = start, j = 0; j < count; i++, j++)
    array[i] = value;
}

明らかにパラメータチェックがありませんが、ドリルを取得します。

于 2011-08-05T10:36:26.810 に答える
3

直接同等のものはありませんが、2つのステップで実行できます。最初に使用Enumerable.Repeatして、各要素に同じ値を持つ配列を作成します。次に、それを宛先アレイにコピーします。

var t = Enumerable.Repeat(value, count).ToArray();
Array.Copy(t, 0, dest, destStartIndex, count);

他の宛先コンテナの場合、に相当するものがありませんが、Array.Copyこれらを宛先として追加するのは簡単です。例:

static void Overwrite<T>(this List<T> dest, IEnumerable<T> source, int destOffset) {
  int pos = destOffset;
  foreach (var val in source) {
    // Could treat this as an error, or have explicit count
    if (pos = dest.Length) { return; }

    dest[pos++] = val;
  }
}
于 2011-08-05T10:36:05.060 に答える