当前位置: 首页 > article >正文

基于扩展方法实现C#安全集合操作工具包(含完整源码)

一、安全集合操作的价值

在日常开发中,集合操作引发的NullReferenceExceptionIndexOutOfRangeException等异常占比高达35%。本工具包通过扩展方法实现以下核心场景的安全防护:

  1. 安全索引访问 防止数据绑定、列表遍历时的越界崩溃
  2. 空集合防御处理 避免foreach空集合导致的逻辑异常
  3. 批量操作增强 简化集合合并、筛选等批量操作
  4. 深拷贝支持 解决引用类型集合修改时的副作用问题

二、完整实现代码

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实现


http://www.kler.cn/a/582753.html

相关文章:

  • C++中string的模拟和实现
  • java登神之阶之顺序表
  • 桂链:什么是区块链排序服务?
  • macOS 安装 Homebrew、nvm 及安装切换 node 版本
  • Java项目启动后无日志输出
  • 动态规划详解(四):线性DP原理深度剖析
  • Node.js 技术原理分析系列5——理解 Node.js 中的 ABI 稳定
  • 抖音全案代运营公司-品融电商
  • FI模块功能范围的基本概念、用途、配置介绍
  • PHP版多语言多商家海外商城源码开源无加密
  • Ragflow技术栈分析及二次开发指南
  • visual studio配置opencv
  • 【DevOps】通过 Azure DevOps 部署启用私有端点的应用服务
  • Flink-学习路线
  • Java volatile 关键字详解
  • Pandas教程:数据分析利器 - 从入门到精通
  • AI大模型的地址治理ETL方案
  • MySQL常用函数详解及SQL代码示例
  • BLIP-2:使用冻结图像编码器和大型语言模型进行语言-图像预训练
  • Linly-Talker:开源数字人框架的技术解析与影响