Language-ext

C#对函数式编程支持的库,支持.net framework,从neget上下载

Option<T>:避免处理空指针

cs 复制代码
        private Option<int> Parse(string v)
        {
            if (int.TryParse(v, out int i))
                return new Some<int>(i);
            return Option<int>.None;
        }

            Option<int> res = Parse("123w");
            res.IfNone(() => { Debug.WriteLine("error"); });
            if (res.IsNone)
            {
                Debug.WriteLine("failed");
            }
            else
            {
                Debug.WriteLine(res.Value<int>());
            }

Either<left, right>:函数式的Error处理

cs 复制代码
     private Either<string, int> ParseInt(string v)
     {
         if(int.TryParse(v, out var i))
         {
             return i;
         }
         return "parse error";
     }

     private Either<string, int> SafeAdd(int v1, int v2)
     {
         return v1 + v2;
     }

     private Either<string, int> SafeDiv(int v1, int v2)
     {
         if (v2 == 0)
             return "Div 0 error";
         return v1 / v2;
     }


            Either<string, int> res02 = ParseInt("23").Bind(v3 => SafeAdd(v3, 10)).Bind(v4 => SafeDiv(v4, 0)).Bind(v5 => SafeAdd(v5, 10));
            int addResult;
            string error;
            var resBool = res02.Match(
                Right: x=> { addResult = x; return true; },
                Left: eInfo=> { error = eInfo; return false; }
                );
            var trupleList = new List<(string, int)> { ("a", 1), ("b", 2) };
            Map<string, int> map = new Map<string, int>(trupleList);
            var v = map.Find("a").Map(v1=>v1 * 2);
            var v2 = map.Find("c");
            var i = v.Value();
            var mapRes = v2.Match(
                Some: x=> true,
                None: false
            );

Match:对Option或Either结果进行解析,见上例

Map:对Option、集合进行映射

Bind:从Option中提取数据后继续执行Map操作

Language-Ext库提供了如上支持,让C#可按函数式编程思路组合多个纯函数。

相关推荐
宝桥南山25 分钟前
.NET 11 - 尝试创建一下AGUIServer和AGUIClient(基于新版.NET SDK for AG-UI)
microsoft·ai·微软·c#·aigc·.net
czhc114007566328 分钟前
加在入口还是出口 —— 以及一个“看着像文件夹“的文件
c#
波力海苔夹心脆67539 分钟前
C# LINQ 入门到上手:一篇讲透查询语法、常用操作符与延迟执行(含示例与速查表
经验分享·c#·.net·solr·linq
进击的大海贼21 小时前
基于C#开发的久坐提醒工具
开发语言·c#
小羊没烦恼!1 天前
关于大型asp.net应用系统的架构-架构的选择
java·服务器·开发语言·前端·c#
小羊没烦恼!2 天前
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
java·开发语言·前端·数据库·算法·c#
UIU1142 天前
头文件可以防什么错?运用头文件做声明
c++·学习·c#
鑫 源2 天前
C#源码开源, 获取macOS 电池数据,包括iOS (xamarin开发)
c#·.net·xamarin
爱吃奥利奥_wen2 天前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#