一、安全集合操作的价值
在日常开发中,集合操作引发的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
实现