C++では、fillを使用して配列(および他の同様のコンテナ)の値の範囲を設定できます。C#とはC++のSTL塗りつぶしメソッドと同じ
例えば、
fill(number, number+n,10);
上記のコードはこれに最も近いC#の同等であるどのような値10
と配列番号の最初のn個の値を設定します。
C++では、fillを使用して配列(および他の同様のコンテナ)の値の範囲を設定できます。C#とはC++のSTL塗りつぶしメソッドと同じ
例えば、
fill(number, number+n,10);
上記のコードはこれに最も近いC#の同等であるどのような値10
と配列番号の最初のn個の値を設定します。
は同等の方法はありませんが、同様のコードから
メソッドを記述する多くの方法がありますLINQのツーオブジェクトクラスを使用すると、リストを初期化するために使用できるシーケンスを作成することができますが、これはどのように物事Cで非常に異なっている++実際に発生します。
new List<char>(Enumerable.Repeat('A', 10));
new List<int>(Enumerable.Range(1, 10));
C++は、より一般的にはC++のテンプレートの仕組みのおかげでこれらの事を達成することができ、およびC#のヘルプの単純型の制約ながら、彼らは同じ柔軟性を提供していません。
直接的な同等物はありませんが、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;
}
}
それが必要な場合は、単に 'Fill'拡張メソッドを作成してください。これはむしろ高価です(たとえそれが問題のより一般的な解決策であっても)。また、パラメータ 'List
私は」 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;
}
を明らかにパラメータのチェックが欠落していますが、ドリルを取得します。
なぜ、 'Repeat'の結果に' ToList'を使用して、リストタイプを明示的に指定する必要がないのでしょうか? – Richard
@リチャード私はなぜ、リストを構築する多くの方法があるのか分かりませんが、タイプ推論が本当に好きですが、この例ではコンストラクタを使用しました。 –