Я должен заполнить a byte[]
с единственным ненулевым значением. Как я могу сделать это в C# без цикличного выполнения через каждого byte
в массиве?
Обновление: комментарии, кажется, разделили это на два вопроса -
memset
Я полностью соглашаюсь, что использование простого цикла работает просто великолепно, как указали Eric и другие. Точка вопроса должна была видеть, мог ли я узнать что-то новое о C# :) Я думаю, что метод Juliet для Параллельной операции должен быть еще быстрее, чем простой цикл.
Сравнительные тесты: благодаря Mikael Svenson: http://techmikael.blogspot.com/2009/12/filling-array-with-default-value.html
Это оказывается простым for
цикл является способом пойти, если Вы не хотите использовать небезопасный код.
Извинения за то, что не были более ясными в моем исходном сообщении. Eric и Mark оба корректны в их комментариях; потребность больше сфокусировать вопросы наверняка. Спасибо за общие предложения и ответы.
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.
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};
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.
Если производительность абсолютно критична, то 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);
Немного поздно, но следующий подход может быть хорошим компромиссом без возврата к небезопасному коду. Обычно он инициализирует начало массива, используя обычный цикл, а затем возвращается к 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;
}
}