You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:06:05