C#开源实用的工具类库,集成超过1000多种扩展方法

news/2025/3/22 13:13:57/文章来源:https://www.cnblogs.com/Can-daydayup/p/18230586

前言

今天大姚给大家分享一个C#开源(MIT License)、免费、实用且强大的工具类库,集成超过1000多种扩展方法增强 .NET Framework 和 .NET Core的使用效率:Z.ExtensionMethods。

直接项目引入类库使用

在你的对应项目中NuGet包管理器中搜索:Z.ExtensionMethods安装即可使用。

支持.NET Standard 2.0和.NET Framework 4.0 。

项目源代码

部分扩展方法展示

MD5哈希算法

public static partial class Extensions
{
    /// <summary>
    /// A Stream extension method that converts the @this to a md 5 hash.
    /// </summary>
    /// <param name="this">The @this to act on.</param>
    /// <returns>@this as a string.</returns>
    public static string ToMD5Hash(this Stream @this)
    {
        using (MD5 md5 = MD5.Create())
        {
            byte[] hashBytes = md5.ComputeHash(@this);
            var sb = new StringBuilder();
            foreach (byte bytes in hashBytes)
            {
                sb.Append(bytes.ToString("X2"));
            }

            return sb.ToString();
        }
    }
}

解压GZip字节数组

public static partial class Extensions
{
    /// <summary>
    /// A byte[] extension method that decompress the byte array gzip to string.
    /// </summary>
    /// <param name="this">The @this to act on.</param>
    /// <returns>The byte array gzip to string.</returns>
    public static string DecompressGZip(this byte[] @this)
    {
        const int bufferSize = 1024;
        using (var memoryStream = new MemoryStream(@this))
        {
            using (var zipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
            {
                // Memory stream for storing the decompressed bytes
                using (var outStream = new MemoryStream())
                {
                    var buffer = new byte[bufferSize];
                    int totalBytes = 0;
                    int readBytes;
                    while ((readBytes = zipStream.Read(buffer, 0, bufferSize)) > 0)
                    {
                        outStream.Write(buffer, 0, readBytes);
                        totalBytes += readBytes;
                    }
                    return Encoding.Default.GetString(outStream.GetBuffer(), 0, totalBytes);
                }
            }
        }
    }

    /// <summary>
    /// A byte[] extension method that decompress the byte array gzip to string.
    /// </summary>
    /// <param name="this">The @this to act on.</param>
    /// <param name="encoding">The encoding.</param>
    /// <returns>The byte array gzip to string.</returns>
    public static string DecompressGZip(this byte[] @this, Encoding encoding)
    {
        const int bufferSize = 1024;
        using (var memoryStream = new MemoryStream(@this))
        {
            using (var zipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
            {
                // Memory stream for storing the decompressed bytes
                using (var outStream = new MemoryStream())
                {
                    var buffer = new byte[bufferSize];
                    int totalBytes = 0;
                    int readBytes;
                    while ((readBytes = zipStream.Read(buffer, 0, bufferSize)) > 0)
                    {
                        outStream.Write(buffer, 0, readBytes);
                        totalBytes += readBytes;
                    }
                    return encoding.GetString(outStream.GetBuffer(), 0, totalBytes);
                }
            }
        }
    }
}

将泛型数组转换为DataTable

public static partial class Extensions
{
    /// <summary>
    /// A T[] extension method that converts the @this to a data table.
    /// </summary>
    /// <typeparam name="T">Generic type parameter.</typeparam>
    /// <param name="this">The @this to act on.</param>
    /// <returns>@this as a DataTable.</returns>
    public static DataTable ToDataTable<T>(this T[] @this)
    {
        Type type = typeof (T);

        PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
        FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance);

        var dt = new DataTable();

        foreach (PropertyInfo property in properties)
        {
            dt.Columns.Add(property.Name, property.PropertyType);
        }

        foreach (FieldInfo field in fields)
        {
            dt.Columns.Add(field.Name, field.FieldType);
        }

        foreach (T item in @this)
        {
            DataRow dr = dt.NewRow();

            foreach (PropertyInfo property in properties)
            {
                dr[property.Name] = property.GetValue(item, null);
            }

            foreach (FieldInfo field in fields)
            {
                dr[field.Name] = field.GetValue(item);
            }

            dt.Rows.Add(dr);
        }

        return dt;
    }
}

支持在线搜索和演示

在线地址:https://csharp-extension.com/en/online-example/

搜索ToMD5Hash:

使用.NET Fiddle在线演示:

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。

  • GitHub开源地址:https://github.com/zzzprojects/Z.ExtensionMethods
  • 在线搜索和演示地址:https://csharp-extension.com/en/online-example/

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。

  • https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

DotNetGuide技术社区交流群

  • DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。
  • 在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
  • 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群👪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/719806.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windos bat批处理脚本,判断是终端命令行运行,还是双击运行

前言全局说明判断是终端命令行运行,还是双击运行一、说明二、文件名:t_echo.bat @echo offecho %CMDCMDLINE% | find "/c" >nul if %errorlevel% equ 0 (echo.echo [ INFO ] 脚本 %~nx0 是双击运行echo.pause ) else (echo.echo [ INFO ] 脚本 %~nx0 在命令行下…

kali简单安装docker和docker-compose

kali简单安装docker和docker-compose 更新kali安装docker sudo apt-get install docker.io安装docker-compose sudo apt-get install docker-compose检查docker和docker-compose sudo docker -v sudo docker-compose -v Pilot-Web靶场安装测试 开启容器 sudo sh init.sh -up -i…

Origin2024如何绘制3D彩色饼图?

饼图是科研中经常用到的图表之一,当我们需要展示部分占整体的比例时,相信很多人都会想到饼图,可以非常直观地体现各部分的占比,之前给大家分享了Origin绘制2D饼图,本期给大家分享绘制3D饼图的操作方法:操作步骤: 1、打开Origin2024软件,然后在Book1中输入如下示例数据,…

在线加密/解密工具

在线文本加密、解密,使用CryptoJS对文本进行AES, TripleDES, Rabbit, RC4, DES加解密。在线AES、DES加密/解密工具

【Socket】解决TCP粘包问题

TCP粘包是指在使用TCP协议进行数据传输时,发送方连续发送的多个数据包在接收方收到时被黏合成一个大的数据包。这种现象可能会导致接收方无法正确解析数据,从而影响应用程序的正常运行。一、介绍 TCP一种面向连接的、可靠的、基于字节流的传输层协议。 三次握手:客户端发送服…

省钱攻略:阿里云99元服务器续费到2027年方法

阿里云99元服务器续费到2027年方法阿里云99元服务器新老用户均可以买!!! 你没看错,老用户可以买!2核2G3M固定带宽,不限流量!! 并且续费不涨价,原价99元即可续费,一直可以续费到2027年,相当于396元买4年 99元服务器 (买4年396元) 新老用户同享 云服务Q 器活动入口: 》》》传…

代码随想录算法训练营第二十四天 | 回溯算法 77.组合

回溯算法理论基础 文章讲解 视频讲解回溯是递归的副产品,只要有回溯就会有递归 回溯的本质是琼剧,所以效率不高回溯法可以解决的问题组合问题 切割问题 子集问题 排列问题 棋盘问题如何理解回溯回溯算法的问题都可以抽象为树形结构 集合的大小就构成了书的快读,递归的深度就…

neural network structure 神经网络

分类 多层感知神经网络——最基础 卷积神经网络——善于图像识别 长短期记忆网络——善于语音识别 多层感知——数字识别 以一张28*28像素的单个数字图片为例,输出对应0-9 ![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml17560\wps1.jpg) 每个像素点的灰度值0-1,即…

Windows bat批处理特殊符号路径处理()圆括号、空格

前言全局说明Windows bat批处理特殊符号路径处理()圆括号、空格 遇到特殊符号路径报 \ was unexpected at this time. 错误一、说明 环境: 版本:Windows 11 家庭版 版本:23H2 操作系统版本:22631.3593二、带括号的路径 2.1 目的:判断,路径下 D:\temp\aa^(1^)\desktop.ini 的…

导出谷歌地图提供的各类地图可视化样式的方法

本文介绍在谷歌地图API(Google Maps APIs)中,设计地图样式并将设计好的样式通过JSON或URL导出的方法~本文介绍在谷歌地图API(Google Maps APIs)中,设计地图样式并将设计好的样式通过JSON或URL导出的方法。首先,进入Google Maps APIs网站。在弹出的窗口中我们可以看到,目…

雷池WAF-动态防护新功能体验

雷池WAF 雷池WAF(Web Application Firewall,网络应用防火墙)是由长亭科技开发的一个网络安全产品,它专注于保护Web应用免受黑客攻击。 今天主要讲的是长亭雷池最近新出的功能:动态防护安装 雷池WAF支持多种安装方式:sh脚本安装、离线安装、牧云助手安装 本篇文章以牧云助…

OpenCloudOS 助力趣丸科技降本增效,容器化高效运行

导读:趣丸科技,一家集兴趣社交、电子竞技、人工智能于一体的创新型科技企业,在采用 OpenCloudOS 开源操作系统后,结合业务特点将容器化集群平均利用率提高到 40% 左右,高峰利用率达 80% ,降本增效的同时,满足了不断增长的业务需求。本文将介绍 OpenCloudOS 在趣丸科技的…