C# Array扩展方法:快速实现Add与AddRange功能

洛溪
洛溪
发布时间:2026-10-14 | 4人浏览过
原创

在C#开发中,原生 Array 一旦定义大小便不可直接修改。为了满足动态添加单个或一组元素的需求,本文将介绍如何封装通用的扩展方法。通过对比基于 Array.Resize 的传统实现与基于 LINQ Concat 的现代写法,展示如何优雅地实现 Add 和 AddRange 功能,并提供完整的测试用例。

背景与目标

C# 中的 Array 属于定长数据结构。当需要往已有数组追加新元素时,常规做法是使用 Array.Resize 扩容并赋值。这一过程较为繁琐,因此将其封装为静态扩展方法,能够显著提升代码的可读性与复用性。

实现准备条件

  1. 环境支持:需具备基本的 C# 编译环境(.NET Framework 2.0+ 或 .NET Core/5+)。
  2. 命名空间:若使用 LINQ 方式,需在文件中引用 using System.Linq;。

第1步:采用传统Resize实现(适用于.NET 2.0)

目的:在不依赖 LINQ 的环境下,手动完成内存分配与数据拷贝。

动作:定义一个包含 Add(单元素)和 AddRange(多元素)方法的静态类。核心逻辑为获取当前长度、执行 Resize 扩容,最后填入新值。

public static T[] Add<T>(this T[] array, T item)
{
  int _count = array.Length;
  Array.Resize<T>(ref array, _count + 1);
  array[_count] = item;
  return array;
}

public static T[] AddRange<T>(this T[] sourceArray, T[] addArray)
{
  int _count = sourceArray.Length;
  int _addCount = addArray.Length;
  
  // 将数组扩容至原有长度加上新增数组长度之和
  Array.Resize<T>(ref sourceArray, _count + _addCount);
  
  // 使用 CopyTo 方法高效拷贝新数据
  addArray.CopyTo(sourceArray, _count);
  
  return sourceArray;
}

第2步:采用LINQ实现(推荐.NET 3.0以上版本)

目的:利用 LINQ 简化代码结构,减少样板代码。

动作:使用 Concat 方法连接源数组与新数据项(组),随后调用 ToArray() 返回结果。

using System.Linq;

public static T[] Add<T>(this T[] array, T item)
{
  // 将单个元素包装为数组并与原数组拼接
  array = array.Concat<T>(new T[1] { item }).ToArray();
  return array;
}

public static T[] AddRange<T>(this T[] sourceArray, T[] addArray)
{
  // 直接合并两个数组
  sourceArray = sourceArray.Concat<T>(addArray).ToArray();
  return sourceArray;
}

验证测试结果

为了确保扩展方法的健壮性,我们需要对“添加单个元素”和“追加数组段”两个场景进行单元覆盖测试。以下分别列出对应的 Assert 验证流程及最终运行结果截图:

验证步骤一:Add 方法测试

[TestMethod()]
public void AddTest()
{
  // 1. 设定预期输出与实际初始状态
  int[] _source = new int[3] { 1, 2, 3 };
  int[] _expected = new int[4] { 1, 2, 3, 4 };

  // 2. 执行扩展方法
  _source = _source.Add(4);

  // 3. 判定是否一致
  CollectionAssert.AreEqual(_source, _expected);
}

验证步骤二:AddRange 方法测试

[TestMethod()]
public void AddRangeTest()
{
  int[] _source = new int[3] { 1, 2, 3 };
  int[] _expected = new int[6] { 1, 2, 3, 4, 5, 6 };

  _source = _source.AddRange(new int[3] { 4, 5, 6 });
  
  CollectionAssert.AreEqual(_source, _expected);
}

上述两种实现均通过测试验证,以下为传统的 Resize 方式测试运行的结果展示:

以下是采用 LINQ Concat 方式编写测试后跑出的运行结果:

简要总结

C# 数组动态扩容本质上是内存重新分配的过程。对于追求性能极致且不依赖高版本的场景,使用 `Array.Resize` 配合 `CopyTo` 是经典方案;而对于日常业务开发与较新版本,LINQ 的方案更具可读性且不易出错。以上就是C#实现Array扩展Add与Addrange功能的详细内容,更多关于C#数组操作技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表