2011-08-05 13 views
1

C++では、fillを使用して配列(および他の同様のコンテナ)の値の範囲を設定できます。C#とはC++のSTL塗りつぶしメソッドと同じ

例えば、

fill(number, number+n,10); 

上記のコードはこれに最も近いC#の同等であるどのような値10

と配列番号の最初のn個の値を設定します。

答えて

4

は同等の方法はありませんが、同様のコードから

メソッドを記述する多くの方法がありますLINQのツーオブジェクトクラスを使用すると、リストを初期化するために使用できるシーケンスを作成することができますが、これはどのように物事Cで非常に異なっている++実際に発生します。

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

C++は、より一般的にはC++のテンプレートの仕組みのおかげでこれらの事を達成することができ、およびC#のヘルプの単純型の制約ながら、彼らは同じ柔軟性を提供していません。

+1

なぜ、 'Repeat'の結果に' ToList'を使用して、リストタイプを明示的に指定する必要がないのでしょうか? – Richard

+0

@リチャード私はなぜ、リストを構築する多くの方法があるのか​​分かりませんが、タイプ推論が本当に好きですが、この例ではコンストラクタを使用しました。 –

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; 
    } 
} 
+0

それが必要な場合は、単に 'Fill'拡張メソッドを作成してください。これはむしろ高価です(たとえそれが問題のより一般的な解決策であっても)。また、パラメータ 'List dest 'を' IList dest'に変更すると、配列とリストの両方で動作するはずです。 –

4

私は」 1が存在している分からないが、あなたは簡単に自分をコーディングすることができます

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

を明らかにパラメータのチェックが欠落していますが、ドリルを取得します。

関連する問題