public static T[] SetAllValues<T>(this T[] array, T value) where T : struct
{
for (int i = 0; i < array.Length; i++)
array[i] = value;
return array;
}
然后像这样调用它
bool[] tenTrueBoolsInAnArray = new bool[10].SetAllValues(true);
作为一种选择,如果你喜欢有一个类在周围,你可以尝试这样的东西
public static class ArrayOf<T>
{
public static T[] Create(int size, T initialValue)
{
T[] array = (T[])Array.CreateInstance(typeof(T), size);
for (int i = 0; i < array.Length; i++)
array[i] = initialValue;
return array;
}
}
7条答案
按热度按时间wqlqzqxt1#
如果你说的“slickest”是指最快的话,恐怕Enumerable.Repeat可能比for循环慢20倍。参见http://dotnetperls.com/initialize-array:
所以使用Dotnetguy的SetAllValues()方法。
ogq8wdun2#
使用Enumerable.Repeat
kpbwa7wx3#
如果您愿意创建一个扩展方法,您可以尝试这样做
然后像这样调用它
作为一种选择,如果你喜欢有一个类在周围,你可以尝试这样的东西
你可以像这样调用
不知道我更喜欢哪一个,虽然我做lurv扩展方法很多很多。
rlcwz9us4#
实际上,我会这样建议:
这样你只分配一个数组。这本质上是一种更简洁的表达方式:
lyfkaqu15#
很多时候,你想用不同的值初始化不同的单元格:
或者在工厂的味道:
qcbq4gxm6#
未经测试,但你能做这个吗?
跳过“new bool[]”部分?
wtlkbnrh7#
在写这个答案的时候,所有的答案都忽略了.NET为此明确提供的功能,调用,我引用.NET代码注解,他们为所有大小不是1字节的类型提供的“优化的主力方法”。如果它的大小只有一个字节,那么memset将被内在地调用。
如果你对它的工作原理感兴趣,workhorse方法涉及到向量化和循环展开的组合,以将所有元素设置在一个保证连续的内存区域中,跨度为给定值。保证允许进一步的构建和JIT优化。要将这个过程向量化,有四个约束:
1.该体系结构必须支持SIMD指令,
1.类型不能是或包含引用,
1.类型的大小不得大于字节向量中的通道数量,
1.类型的大小必须是2的幂。
要利用这一点,您只需要调用Array.Fill或span的Fill方法。下面是一个示例: