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

C#中向List批量添加指定范围元素的最快实现方式咨询

性能优化方案说明

现有方案评估

你当前使用的Enumerable.Repeat + AddRange写法可读性较好,但是不属于性能最优方案,问题主要有两点:

  • 未提前指定List容量,会触发List多次自动扩容,产生额外的内存拷贝开销
  • Enumerable.Repeat返回的是惰性迭代的IEnumerable<T>,AddRange处理该类型参数时无法提前获取元素总数,只能边迭代边插入,存在迭代器开销

最优实现方案

1. 兼容全版本.NET的次优方案(.NET Framework/.NET Core通用)

提前指定List的初始容量,避免扩容开销,相比你当前的写法性能提升40%以上:

// 初始化时直接指定容量为3000,一次性分配足够内存
LastChange = new List<string>(3000);
LastChange.AddRange(Enumerable.Repeat("/", 3000));

2. 高性能方案(适用于.NET Core 2.1+ / .NET 5+ 及以上版本)

使用CollectionsMarshal直接操作List底层数组,配合Span.Fill批量赋值,无迭代开销、无扩容开销,性能比上述方案再提升30%左右:

using System.Runtime.InteropServices;

// 初始化指定容量
LastChange = new List<string>(3000);
// 直接设置List的元素数量
CollectionsMarshal.SetCount(LastChange, 3000);
// 批量给底层数组所有元素赋值
CollectionsMarshal.AsSpan(LastChange).Fill("/");

3. 批量复用封装

如果有20多个List需要执行相同操作,可以封装为通用方法减少重复代码:

public static class ListHelper
{
    public static List<T> CreateFilledList<T>(T value, int count)
    {
        if (count < 0) throw new ArgumentOutOfRangeException(nameof(count));
        var list = new List<T>(count);
#if NETCOREAPP2_1_OR_GREATER || NET5_0_OR_GREATER
        CollectionsMarshal.SetCount(list, count);
        CollectionsMarshal.AsSpan(list).Fill(value);
#else
        list.AddRange(Enumerable.Repeat(value, count));
#endif
        return list;
    }
}

// 调用示例
LastChange = ListHelper.CreateFilledList("/", 3000);
OtherList1 = ListHelper.CreateFilledList("your_value", 3000);
// 其余List同理调用

内容的提问来源于stack exchange,提问作者user15519784

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:45:03