Что такое C # Эквивалент C ++ STL метод заполнения - PullRequest
1 голос
/ 05 августа 2011

В C ++ мы можем установить диапазон значений массива (и других подобных контейнеров), используя fill.

Например,

fill(number, number+n,10);

Приведенный выше код установит первыйn значений номера массива со значением 10.

Что является ближайшим эквивалентом C # к этому.

Ответы [ 3 ]

4 голосов
/ 05 августа 2011

Я не уверен, что он существует, но вы можете легко написать свой собственный код:

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

Очевидно, что отсутствует проверка параметров, но вы получаете детализацию.

4 голосов
/ 05 августа 2011

Нет эквивалентного метода, но есть много способов написать подобный код

Методы из классов Linq-to-Objects могут создавать последовательности, которые вы можете использовать для инициализации списков, но это сильно отличается от того, как в действительности происходят вещи в C ++.

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

C ++ может выполнять эти задачи в более общем плане благодаря тому, как работают шаблоны C ++, и хотя простые ограничения типов в C # помогают, они не обеспечивают такой же гибкости.

3 голосов
/ 05 августа 2011

Прямого эквивалента не существует, но вы можете сделать это в два этапа. Сначала используйте 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;
  }
}
...