Каков эквивалент memset в C#?

Я должен заполнить a byte[] с единственным ненулевым значением. Как я могу сделать это в C# без цикличного выполнения через каждого byte в массиве?

Обновление: комментарии, кажется, разделили это на два вопроса -

  1. Есть ли метод Платформы для заполнения байта [], который мог бы быть сродни memset
  2. Что самый эффективный путь состоит в том, чтобы сделать это, когда мы имеем дело с очень большим массивом?

Я полностью соглашаюсь, что использование простого цикла работает просто великолепно, как указали Eric и другие. Точка вопроса должна была видеть, мог ли я узнать что-то новое о C# :) Я думаю, что метод Juliet для Параллельной операции должен быть еще быстрее, чем простой цикл.

Сравнительные тесты: благодаря Mikael Svenson: http://techmikael.blogspot.com/2009/12/filling-array-with-default-value.html

Это оказывается простым for цикл является способом пойти, если Вы не хотите использовать небезопасный код.

Извинения за то, что не были более ясными в моем исходном сообщении. Eric и Mark оба корректны в их комментариях; потребность больше сфокусировать вопросы наверняка. Спасибо за общие предложения и ответы.

78
задан Jim Fell 1 June 2016 в 16:00
поделиться

5 ответов

You could use Enumerable.Repeat:

byte[] a = Enumerable.Repeat((byte)10, 100).ToArray();

The first parameter is the element you want repeated, and the second parameter is the number of times to repeat it.

This is OK for small arrays but you should use the looping method if you are dealing with very large arrays and performance is a concern.

58
ответ дан 24 November 2019 в 10:28
поделиться

You could do it when you initialize the array but I don't think that's what you are asking for:

byte[] myBytes = new byte[5] { 1, 1, 1, 1, 1};
4
ответ дан 24 November 2019 в 10:28
поделиться

If performance is critical, you could consider using unsafe code and working directly with a pointer to the array.

Another option could be importing memset from msvcrt.dll and use that. However, the overhead from invoking that might easily be larger than the gain in speed.

12
ответ дан 24 November 2019 в 10:28
поделиться

Если производительность абсолютно критична, то Enumerable.Repeat (n, m) .ToArray () будет слишком медленным для ваших нужд. Возможно, вы сможете повысить производительность с помощью PLINQ или библиотеки параллельных задач :

using System.Threading.Tasks;

// ...

byte initialValue = 20;
byte[] data = new byte[size]
Parallel.For(0, size, index => data[index] = initialValue);
9
ответ дан 24 November 2019 в 10:28
поделиться

Немного поздно, но следующий подход может быть хорошим компромиссом без возврата к небезопасному коду. Обычно он инициализирует начало массива, используя обычный цикл, а затем возвращается к Buffer.BlockCopy () , что должно быть максимально быстрым, чем вы можете получить с помощью управляемого вызова.

public static void MemSet(byte[] array, byte value) {
  if (array == null) {
    throw new ArgumentNullException("array");
  }
  const int blockSize = 4096; // bigger may be better to a certain extent
  int index = 0;
  int length = Math.Min(blockSize, array.Length);
  while (index < length) {
    array[index++] = value;
  }
  length = array.Length;
  while (index < length) {
    Buffer.BlockCopy(array, 0, array, index, Math.Min(blockSize, length-index));
    index += blockSize;
  }
}
21
ответ дан 24 November 2019 в 10:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: