目录
前言
推荐一个开源、免费全龄段友好的.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技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!优秀是一种习惯,欢迎大家留言学习!