你知道的在C#中初始化动态大小的数组最简便的方式是什么?
这是我能想到的最好方法。
private bool[] GetPageNumbersToLink(IPagedResult result)
{
if (result.TotalPages <= 9)
return new bool[result.TotalPages + 1].Select(b => true).ToArray();
...
Initialize with for loop: 85 ms [much faster]
Initialize with Enumerable.Repeat: 1645 ms
那就使用Dotnetguy的SetAllValues()方法。
编辑:如评论者指出,我的原始实现不起作用。这个版本可以工作,但基于for循环的方式相对来说不太流畅。
如果您愿意创建一个扩展方法,您可以尝试使用以下代码:
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;
}
}
您可以像调用以下代码一样调用它:
bool[] tenTrueBoolsInAnArray = ArrayOf<bool>.Create(10, true);
我不确定我更喜欢哪种,虽然一般来说我非常喜欢扩展方法。
ArrayEx.Create(10, true);
。 - nawfalArray.CreateInstance
,只需使用 new T[]
。 - Ohad Schneider实际上,我建议:
return Enumerable.Range(0, count).Select(x => true).ToArray();
这种方法只需要分配一个数组。本质上,这是一种更简洁的表达方式:
var array = new bool[count];
for(var i = 0; i < count; i++) {
array[i] = true;
}
return array;
public static void Init<T>(this T[] arr, Func<int, T> factory)
{
for (int i = 0; i < arr.Length; i++)
{
arr[i] = factory(i);
}
}
或者以工厂的方式:
public static T[] GenerateInitializedArray<T>(int size, Func<int, T> factory)
{
var arr = new T[size];
for (int i = 0; i < arr.Length; i++)
{
arr[i] = factory(i);
}
return arr;
}
在撰写本答案时,所有答案都忽略了.NET明确为此提供的功能,引用.NET代码注释,他们的“优化工作方法”适用于所有大小不为1字节的类型。如果只有一个字节,则将调用memset。
如果您对其如何工作感兴趣,则工作方法涉及将矢量化和循环展开相结合,以使用跨度设置保证连续的内存区域中的所有元素为给定值。该保证允许进行更进一步的构建和JIT优化。 要矢量化此过程,有四个约束条件:
要利用此功能,您只需要调用Array.Fill或跨度的Fill方法即可。以下是一个示例:
var a = new bool[1_000];
Array.Fill(a, true); // Same as: a.AsSpan().Fill(true);
Console.WriteLine(String.Join(", ", a));
未经测试,但你能试着这样做吗?
return result.Select(p => true).ToArray();
跳过 "new bool[]" 部分?
var arr = new type[10]; for (int i = 0; i < arr.Length; i++) arr[i] = value;
,这是76个字符的代码,每个人都能理解。相比之下,有67个字符的模糊操作。 - Aidiakapi