2

在 C++ 中,我们可以使用填充来设置数组(和其他类似容器)的一系列值。

例如,

fill(number, number+n,10);

上面的代码将数组编号的前 n 个值设置为 10。

与此最接近的 C# 是什么。

4

3 回答 3

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 回答
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 回答
3

没有直接的等价物,但您可以分两步完成。首先使用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 回答