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#可按函数式编程思路组合多个纯函数。

相关推荐
hez20101 天前
在 .NET 上构建超大托管数组
c#·.net·.net core·gc·clr
狼爷4 天前
吃透 Java Function 接口,搞定 99% 的 Stream 场景
java·函数式编程
雨落倾城夏未凉7 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
唐青枫8 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫9 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m6259 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户91721561902119 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠10 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
唐青枫12 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech12 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf