0

0

C# 如何自定义LINQ扩展方法 - 为IEnumerable添加新功能

幻夢星雲

幻夢星雲

发布时间:2025-12-25 11:11:26

|

613人浏览过

|

来源于php中文网

原创

C#中为IEnumerable添加自定义LINQ扩展方法需满足三条件:定义在非泛型静态类中、方法为静态、首个参数用this修饰IEnumerable;例如GetOrDefault扩展可安全取第N个元素并越界返回默认值。

c# 如何自定义linq扩展方法 - 为ienumerable<t>添加新功能

在 C# 中,为 IEnumerable 添加自定义 LINQ 扩展方法,本质是写一个 静态类中的静态方法,且第一个参数用 this 修饰符绑定到 IEnumerable 类型。这样就能像原生 WhereSelect 那样链式调用。

扩展方法必须满足的三个条件

缺一不可,否则编译器不认作扩展方法:

  • 方法必须定义在非泛型静态类中(比如叫 EnumerableExtensions
  • 方法本身必须是静态方法
  • 第一个参数必须是 this IEnumerable source(或具体类型如 this IEnumerable source),且 T 要在方法签名中声明为泛型参数

写一个实用的扩展:GetOrDefault

类似字典的 TryGetValue,但用于集合——安全取第 N 个元素,越界时返回默认值而非异常:

public static class EnumerableExtensions
{
    public static T GetOrDefault(this IEnumerable source, int index, T defaultValue = default)
    {
        if (source == null) throw new ArgumentNullException(nameof(source));
        if (index < 0) return defaultValue;
    // 尽量避免 ToList(),用迭代器高效处理
    var enumerator = source.GetEnumerator();
    for (int i = 0; i <= index; i++)
    {
        if (!enumerator.MoveNext())
            return defaultValue;
        if (i == index)
            return enumerator.Current;
    }
    return defaultValue;
}

}

使用示例:

KGOGOMALL
KGOGOMALL

主要功能:无限级分类,可自由调整分类位置,商品可在各分类间自由转移; 商品组合:可以为每种商品添加多种选项,方便顾客购买选择,比如:一件衣服顾客可以选择款式、花色、大小等,笔记本电脑,可以有cpu、内存、显示屏、硬盘等等扩展属性; 会员分级功能,会员积分功能。可根据会员积分自行设定用户组,管理员可自行定义会员获得积分的方式:按订单总金额或者按单个商品给予积分; 按照商品类别查看热卖、特价,允

下载
var list = new[] { "a", "b", "c" };
Console.WriteLine(list.GetOrDefault(1));     // "b"
Console.WriteLine(list.GetOrDefault(5));     // null(string 默认值)
Console.WriteLine(list.GetOrDefault(5, "N/A")); // "N/A"

注意性能与空值安全

扩展方法不是魔法,它只是语法糖。实际调用仍走迭代逻辑,所以要注意:

  • 避免在方法内部无脑调用 ToList()ToArray(),尤其对大数据流或 IO 枚举器(如文件行枚举)会造成额外内存和延迟
  • 始终校验 source 是否为 null,并给出清晰异常信息
  • 如果扩展行为依赖索引(如分页、取第 N 项),考虑是否支持 IList 优化路径(用 source is IList list ? list[index] : ...

让扩展方法支持链式调用和延迟执行

保持与标准 LINQ 一致的行为:返回 IEnumerable、不立即执行、支持 yield return

public static IEnumerable WhereNotNull(this IEnumerable source) where T : class
{
    if (source == null) throw new ArgumentNullException(nameof(source));
    foreach (T item in source)
    {
        if (item != null) yield return item;
    }
}

这样就能无缝接入现有链式调用:

var result = items.Where(x => x.Length > 3)
                  .WhereNotNull()
                  .Select(x => x.ToUpper());

基本上就这些。核心就是“静态类 + 静态方法 + this 参数”,再加一点对延迟执行和空值的敬畏。写多了你会发现,自己写的扩展和 LINQ 原生方法用起来几乎没区别

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

311

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

226

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

430

2024.03.01

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

0

2025.12.24

php框架基础知识汇总
php框架基础知识汇总

php框架是构建web应用程序的架构,提供工具和功能,以简化开发过程。选择合适的框架取决于项目需求和技能水平。实战案例展示了使用laravel构建博客的步骤,包括安装、创建模型、定义路由、编写控制器和呈现视图。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.24

Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

2

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 5.9万人学习

Django 教程
Django 教程

共28课时 | 2.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号