如何在.NET 5中通过函数内联的方式填充数组?
问题解答
核心结论
- .NET 5 及后续官方基类库未内置支持传入值生成函数的原生
Array.Fill重载方法。现有原生Array.Fill仅支持填充固定常量值,传入方法调用时只会执行一次生成单值填充全数组,和需求的动态生成每个元素值的行为不符。 - 你目前使用的
Array.ConvertAll方案会额外生成新数组,对于大数组场景会产生不必要的内存和CPU开销,普通循环逻辑的性能最好,可通过封装扩展方法适配内联写法的代码风格要求。
最优解决方案:自定义扩展方法
直接封装循环逻辑为扩展方法,既符合内联调用的代码风格,也不会产生冗余数组分配,性能最优。
C# 实现示例
public static class ArrayExtensions { public static void Fill<T>(this T[] targetArray, Func<T> valueGenerator) { if (targetArray == null) throw new ArgumentNullException(nameof(targetArray)); if (valueGenerator == null) throw new ArgumentNullException(nameof(valueGenerator)); for (int i = 0; i < targetArray.Length; i++) { targetArray[i] = valueGenerator(); } } } // 调用示例 var myRandom = new Random(); int[] myArray = new int[10]; myArray.Fill(() => myRandom.Next(10));
VB.NET 实现示例
Imports System.Runtime.CompilerServices Module ArrayExtensions <Extension()> Sub Fill(Of T)(targetArray As T(), valueGenerator As Func(Of T)) If targetArray Is Nothing Then Throw New ArgumentNullException(NameOf(targetArray)) If valueGenerator Is Nothing Then Throw New ArgumentNullException(NameOf(valueGenerator)) For i As Integer = 0 To targetArray.Length - 1 targetArray(i) = valueGenerator() Next End Sub End Module ' 调用示例 Dim myRandom As New Random() Dim myArray(9) As Integer myArray.Fill(Function() myRandom.Next(10))
临时替代方案(无需自定义扩展)
如果是初始化新数组的场景,可以用LINQ的内联写法,仅产生一次数组分配:
// C# 示例 int[] myArray = Enumerable.Range(0, 10).Select(_ => myRandom.Next(10)).ToArray();
' VB.NET 示例 Dim myArray As Integer() = Enumerable.Range(0, 10).Select(Function(_) myRandom.Next(10)).ToArray()
注意:该方案仅适合新建数组场景,若需要修改已有数组,仍推荐使用自定义扩展方法,避免额外的数组分配开销。
内容的提问来源于stack exchange,提问作者Bogdan Samchuk
相关产品推荐
相关产品推荐

