通用 .NET 万能工具库 Masuit.Tools

目录

前言

项目介绍

项目环境

项目程序包

基础功能包

增值包

为工具库注册配置(可选的,按需配置)

项目示例

一些创意类型

1、纳秒级性能计时器

2、数值转换

3、任意进制转换/中文数字/大写数字

4、敏感信息掩码

5、任何类型支持链式调用

6、产生分布式唯一有序短id(雪花id)

7、随机数

8、权重随机筛选功能

9、树形结构实现

10、简单的Excel导出

项目地址


前言

推荐一个开源、免费全龄段友好的.NET 万能工具库。对于刚刚入门的新手,还是经验丰富的大佬,这个工具库能够帮助我们快速解决开发过程中的基础问题。

整个库的代码量不到 2MB,确保了高效且轻量级的使用体验。

项目介绍

Masuit.Tools 包含了一系列常用的静态操作类,涵盖了加密解密、反射操作、权重随机筛选算法、分布式短ID生成、表达式树、Linq 扩展、文件压缩、多线程下载、硬件信息获取、字符串扩展方法、日期时间操作、中国农历计算、大文件拷贝、图像裁剪、验证码生成、断点续传、集合扩展以及 Excel 导出等多种实用功能。

具体内容,请点击查看思维导图。

项目环境

  • 操作系统:Windows 11 23H2及以上版本
  • 开发工具:VisualStudio2022 v17.8及以上版本
  • SDK:.NET Core 2.1.0及以上所有版本

项目程序包

基础功能包

1、.NET Framework ≥ 4.6.2

PM> Install-Package Masuit.Tools.Net

2、.NET Standard ≥ 2.1 或只想使用一些基本功能

通用项目推荐首选包

PM> Install-Package Masuit.Tools.Abstraction

3、.NET Core ≥ 2.1

.NET Core项目推荐首选包

PM> Install-Package Masuit.Tools.Core

4、.NET Framework 4.5 特供版

请注意:这是.NET Framework 4.5的专用版本,相比4.6.2及.NET Core的版本,阉割了Redis、HTML、文件压缩、ASP.NET扩展、硬件监测、Session扩展等一些功能。

如果你的项目版本高于4.6.2,请务必使用上述版本的包,以享受完整的功能体验!

PM> Install-Package Masuit.Tools.Net45
增值包

1、Masuit.Tools.AspNetCore

AspNetCore项目推荐首选包 ASP.NET Core Web专用包

包含Masuit.Tools.Core的全部功能,并且增加了一些对ASP.NET Core Web功能的额外支持。

2、Masuit.Tools.Excel

Excel导入导出的专用独立包

3、Masuit.Tools.NoSQL.MongoDBClient

mongodb的封装操作类独立包

为工具库注册配置(可选的,按需配置)

工具库需要用到外部配置节,.NET Framework项目配置在web.config/app.config的AppSettings配置节中,.NET Core项目配置在appsettings.json中:

1、EmailDomainWhiteList,邮箱校验需要用到的白名单域名,英文逗号分隔,每个元素支持正则表达式,若未配置,则不启用邮箱校验白名单,示例:

^\\w{1,5}@qq.com,^\\w{1,5}@163.com,^\\w{1,5}@gmail.com,^\\w{1,5}@outlook.com

2、EmailDomainBlockList,邮箱校验需要用到的黑名单域名,英文逗号分隔,每个元素支持正则表达式,且黑名单优先级高于白名单,若未配置,则不启用邮箱校验黑白名单

public Startup(IConfiguration configuration)
{
    configuration.AddToMasuitTools(); 
// 若未调用,则默认自动尝试加载appsettings.json
}

项目示例

一些创意类型

1、DisposableDictionary:可被Disposable的字典类型,用于存放Value是Disposable类型的数据,用法和普通字典一致

2、NullableConcurrentDictionary/NullableDictionary:Key可为null的字典类型,用法和普通字典一致

3、ConcurrentHashSet:并发HashSet,用法和HashSet一致

4、ConcurrentLimitedQueue:定长并发队列,特点是长度是固定的,用法与ConcurrentQueue一致

5、LimitedQueue:定长队列,特点是长度是固定的,用法与Queue一致

6、LargeMemoryStream:超大内存流,最大可支持1TB数据,推荐当数据流大于2GB时使用,用法与MemoryStream一致

7、PooledMemoryStream:池化内存流,可内存复用,用法与MemoryStream一致,性能比MemoryStream好

8、ITree< T>:树形实体接口约束,实现该接口可让类型实现一些树形操作

9、ChineseCalendar:中国农历类型,可以实现天干地支节气等数据的获取

10、Clay/DynamicFactory:粘土动态类型,可实现类似js的弱类型编程

11、RadarChart:雷达图类型,可用于做数据分析或用户行为画像

12、Circle:圆形类型,可实现⚪的相交相切相离的判断

13、Sphere:球体类型,可实现计算球体上两点的弧长计算,相交相切相离的判断

14、MimeMapper:mime类型映射

15、VersionNumber:版本号类型,比System.Version功能更多一点,用法一致

1、纳秒级性能计时器
HiPerfTimer timer = HiPerfTimer.StartNew();
for (int i = 0; i < 100000; i++)
{
  //todo
}
timer.Stop();
Console.WriteLine("执行for循环100000次耗时"+timer.Duration+"s");

double time = HiPerfTimer.Execute(() =>
{
    for (int i = 0; i < 100000; i++)
    {
        //todo
    }
});
Console.WriteLine("执行for循环100000次耗时"+time+"s");
2、数值转换
1.2345678901.Digits8(); // 将小数截断为8位
1.23.ConvertTo<int>(); // 小数转int
1.23.ConvertTo<T>(); // 小数转T基本类型
bool b=1.23.TryConvertTo<T>(out result); // 小数转T基本类型
var num=1.2345.ToDecimal(2); //转decimal并保留两位小数
3、任意进制转换/中文数字/大写数字
var num=123.45.ToChineseMoney(); // 壹佰贰拾叁元肆角伍分
var num=123.45.ToChineseNumber(); // 一百二十三点四五
4、敏感信息掩码
"13123456789".Mask(); // 131****5678
"admin@masuit.com".MaskEmail(); // a****n@masuit.com
// Attribute的方式为json序列化时进行数据脱敏
public class MyClass
{
    [JsonConverter(typeof(MaskEmailConverter))] 
    // 请注意命名空间,使用Newtonsoft.Json请导入Masuit.Tools.Systems命名空间,使用System.Text.Json请导入Masuit.Tools.Systems.Text.Json命名空间
    public string Email { get; set; }
    [JsonConverter(typeof(MaskConverter))] 
    // 请注意命名空间,使用Newtonsoft.Json请导入Masuit.Tools.Systems命名空间,使用System.Text.Json请导入Masuit.Tools.Systems.Text.Json命名空间
    public string PhoneNumber { get; set; }
}
5、任何类型支持链式调用
a.Next(func1).Next(func2).Next(func3);
"123".Next(s=>s.ToInt32()).Next(x=>x*2).Next(x=>Math.Log(x));
6、产生分布式唯一有序短id(雪花id)
// 实例调用
var sf = SnowFlake.GetInstance();
string id = sf.GetUniqueId();
// rcofqodori0w
var sfn = SnowFlakeNew.GetInstance(); 
// 改良版雪花id,对时间回拨不敏感
string id = sfn.GetUniqueId();
// vmbq8q3s3zul

// 静态调用
string id = SnowFlake.NewId;
// rcofqodori0w
string shortId = sf.GetUniqueShortId(8);
// qodw9728
string id = SnowFlakeNew.NewId;
// 改良版雪花id,对时间回拨不敏感

// 全局设置
SnowFlake.SetMachienId(1); 
// 设置机器id
SnowFlake.SetInitialOffset(4219864516915105792);
// 设置起始偏移量
SnowFlake.SetNumberFormater(new NumberFormater("0123456789abcdefghijklmnopqrstuvwxyz._-!"));
// 设置数制格式化器
SnowFlakeNew.SetMachienId(1); 
// 设置机器id
SnowFlakeNew.SetInitialOffset(4219864516915105792);
// 设置起始偏移量
SnowFlakeNew.SetNumberFormater(new NumberFormater("0123456789abcdefghijklmnopqrstuvwxyz._-!"));
// 设置数制格式化器
7、随机数
Random rnd = new Random();
int num = rnd.StrictNext();
//产生真随机数
double gauss = rnd.NextGauss(20,5);
//产生正态高斯分布的随机数
var s = new NumberFormater(62).ToString(new Random().Next(100000, int.MaxValue));
//生成随机字符串
8、权重随机筛选功能
var data=new List<WeightedItem<string>>()
{
     new WeightedItem<string>("A", 1),
     new WeightedItem<string>("B", 3),
     new WeightedItem<string>("C", 4),
     new WeightedItem<string>("D", 4),
};
var item=data.WeightedItem();
//按权重选出1个元素
var list=data.WeightedItems(2);
//按权重选出2个元素
var selector = new WeightedSelector<string>(new List<WeightedItem<string>>()
{
    new WeightedItem<string>("A", 1),
    new WeightedItem<string>("B", 3),
    new WeightedItem<string>("C", 4),
    new WeightedItem<string>("D", 4),
});
var item = selector.Select();
//按权重选出1个元素
var list = selector.SelectMultiple(3);
//按权重选出3个元素
list.WeightedItems(3,e=>e.Price);
// 按价格权重选出3个元素
list.WeightedBy(e=>e.Price);
// 按价格权重选出1个元素
9、树形结构实现

基本接口类: ITreeChildren:带Children属性的接口

ITreeParent:带Parent属性的接口

ITree:继承ITreeParent和ITreeChildren,同时多了Name属性

ITreeEntity:继承ITreeChildren,同时多了Id和ParentId属性

trees.Filter(func); 
// 从树形集合中过滤
trees.Flatten(); 
// 将数据平铺开
tree.AllChildren(); 
// 获取所有的子级
tree.AllParent(); 
// 获取所有的父级
tree.IsRoot(); 
// 是否是根节点
tree.IsLeaf(); 
// 是否是叶子节点
tree.Level(); 
// 所处深度/层级
tree.Path();
// 全路径

var tree=list.ToTree();
//集合元素继承自ITreeEntity<T,TKey>或ITreeEntity<T>的集合转换成树形结构
var tree=list.ToTree(c => c.Id, c => c.Pid);
//集合元素继承自ITreeParent<T>, ITreeChildren<T>的集合转换成树形结构
var tree=list.ToTreeGeneral(c => c.Id, c => c.Pid);
//一般的集合转换成树形结构

10、简单的Excel导出

需要额外依赖包:Masuit.Tools.Excel

var stream=list.Select(item=>new{
    姓名=item.Name,
    年龄=item.Age,
    item.Gender,
    Avatar=Image.FromStream(filestream) 
    //图片列
}).ToDataTable().ToExcel("Sheet1"); 
//自定义列名导出
var stream=list.ToDataTable("Sheet1").ToExcel("文件密码");

一些约定规则:

1、图片列支持Stream、Bitmap、IEnumerable < Stream>、IEnumerable < Bitmap>、IDictionary<string,Stream>、IDictionary<string,MemoryStream>、IDictionary<string,Bitmap>类型;

2、其中,如果是IDictionary类型的图片列,字典的键为图片超链接的完整url;

3、默认字段名作为列名导出;

4、若list是一个具体的强类型,默认会先查找每个字段的Description标记,若有Description标记,则取Description标记作为列名显示

5、ToExcel方法支持DataTable、List < DataTable>、Dictionary<string, DataTable>类型的直接调用

还有很多扩展方法,就不一一列举了,具体可以查看项目地址,按需使用。

项目地址

Github:https://github.com/ldqk/Masuit.Tools

文档地址:https://www.masuit.tools/guid/

在线体验:https://replit.com/@ldqk/MasuitToolsDemo#main.cs

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!优秀是一种习惯,欢迎大家留言学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值