基于扩展方法实现C#安全集合操作工具包(含完整源码)
一、安全集合操作的价值
在日常开发中,集合操作引发的NullReferenceException
、IndexOutOfRangeException
等异常占比高达35%。本工具包通过扩展方法实现以下核心场景的安全防护:
- 安全索引访问 防止数据绑定、列表遍历时的越界崩溃
- 空集合防御处理 避免
foreach
空集合导致的逻辑异常 - 批量操作增强 简化集合合并、筛选等批量操作
- 深拷贝支持 解决引用类型集合修改时的副作用问题
二、完整实现代码
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Text;
/// <summary>
/// 集合安全操作扩展工具包
/// </summary>
public static class SafeCollectionExtensions
{
/// <summary>
/// 安全获取集合元素[6](@ref)
/// </summary>
/// <param name="index">元素索引</param>
/// <param name="defaultValue">默认返回值</param>
/// <returns>存在返回元素,否则返回默认值</returns>
public static T SafeGet<T>(this IList<T> source, int index, T defaultValue = default)
{
if (source == null) return defaultValue;
return (index >= 0 && index < source.Count) ? source[index] : defaultValue;
}
/// <summary>
/// 判断集合是否为空(支持null检测)
/// </summary>
public static bool IsNullOrEmpty<T>(this IEnumerable<T> source)
{
return source == null || !source.Any();
}
/// <summary>
/// 安全批量添加元素[3](@ref)
/// </summary>
/// <param name="items">待添加元素集合</param>
public static void AddRangeSafe<T>(this IList<T> target, IEnumerable<T> items)
{
if (target == null || items.IsNullOrEmpty()) return;
foreach (var item in items.Where(item => item != null))
{
target.Add(item);
}
}
/// <summary>
/// 深度克隆集合[5](@ref)
/// </summary>
/// <typeparam name="T">可序列化类型</typeparam>
public static List<T> DeepClone<T>(this IEnumerable<T> source)
{
if (source.IsNullOrEmpty()) return new List<T>();
var serializer = new DataContractJsonSerializer(typeof(List<T>));
using (var ms = new MemoryStream())
{
serializer.WriteObject(ms, source.ToList());
ms.Position = 0;
return (List<T>)serializer.ReadObject(ms);
}
}
}
三、实战应用教程
场景1:安全读取配置数据
var configList = GetConfigFromAPI(); // 可能返回null
// 传统方式
if (configList != null && configList.Count > 5)
{
var value = configList[5];
}
// 扩展方法方式
var safeValue = configList.SafeGet(5, "default");
场景2:批量导入数据校验
// 原始集合
List<Product> products = new List<Product>();
// 待导入数据(可能包含null)
var importedData = GetExternalData();
// 安全批量添加
products.AddRangeSafe(importedData?.Where(p => p.IsValid));
场景3:集合状态检测
void ProcessOrders(IEnumerable<Order> orders)
{
if (orders.IsNullOrEmpty())
{
ShowAlert("无待处理订单");
return;
}
// 处理逻辑...
}
四、技术特性解析
方法名称 | 安全机制 | 性能优化点 |
SafeGet | 空引用检查 + 索引范围验证 | 避免多次null判断 |
AddRangeSafe | 空集合过滤 + 元素有效性检查 | 使用Where过滤减少循环次数 |
DeepClone | JSON序列化实现深度复制 | MemoryStream减少内存分配 |
IsNullOrEmpty | 组合null判断与Any()延迟执行 | 优于Count属性的O(1)时间复杂度 |
五、本工具包的优势
通过扩展方法实现的集合安全操作包具有以下优势:
✅ 零入侵:不修改原始集合类型代码
✅ 高复用:通过using
指令全局生效
✅ 强兼容:支持List<T>
、Array
等所有IEnumerable
实现