C#高级:常用的扩展方法大全

server/2025/1/27 13:48:49/

1.String

public static class StringExtensions
{/// <summary>/// 字符串转List(中逗 英逗分隔)/// </summary>public static List<string> SplitCommaToList(this string data){if (string.IsNullOrEmpty(data)){return new List<string>();}data = data.Replace(",", ",");//中文逗号转化为英文return data.Split(",").ToList();}/// <summary>/// 字典按序替换字符串(用key代替value)/// </summary>/// <returns></returns>public static string DictionaryReplace(this string input, Dictionary<string, string> replacements){if (string.IsNullOrEmpty(input) || replacements == null || replacements.Count == 0){return input;}foreach (var replacement in replacements){input = input.Replace(replacement.Value, replacement.Key);//用key代替value}return input;}/// <summary>/// 反序列化成实体/// </summary>public static T ConvertToEntity<T>(this string json)//可传入列表,实体{return JsonSerializer.Deserialize<T>(json);}}

2.DateTime

3.List

public static class ListExtensions
{/// <summary>/// 例如输入1 3 输出第1个(含)到第3个(含)的实体列表/// </summary>public static List<T> GetRangeList<T>(this List<T> list, int startIndex, int endIndex){// 检查索引范围是否有效if (startIndex < 1 || endIndex > list.Count || startIndex > endIndex){//throw new ArgumentOutOfRangeException("输入的索引值超出了列表的长度或范围不正确!");return new List<T>();}// 返回指定范围内的元素return list.GetRange(startIndex - 1, endIndex - startIndex + 1);}/// <summary>/// 传入列表和需要获取的数量,返回随机选出的元素/// </summary>/// <returns></returns>public static List<T> GetRandomList<T>(this List<T> list, int count){// 检查列表是否足够if (list.Count < count){//throw new ArgumentException("列表中的元素不足,无法随机选择所需数量的元素。");return new List<T>();}// 使用 Random 类生成随机索引Random random = new Random();// 随机选择不重复的元素return list.OrderBy(x => random.Next()).Take(count).ToList();}/// <summary>/// 按指定字段,顺序排序,且返回xx条/// </summary>/// <returns></returns>public static List<V> OrderByAndTake<T, V>(this List<V> list, Expression<Func<V, T>> keySelector, int count){if (list == null || !list.Any() || count <= 0){return new List<V>();}var sortedlist = list.OrderBy(keySelector.Compile());return sortedlist.Take(count).ToList();}/// <summary>/// 按指定字段,倒序排序,且返回xx条/// </summary>/// <returns></returns>public static List<V> OrderByDescAndTake<T, V>(this List<V> list, Expression<Func<V, T>> keySelector, int count){if (list == null || !list.Any() || count <= 0){return new List<V>();}var sortedlist = list.OrderByDescending(keySelector.Compile());return sortedlist.Take(count).ToList();}/// <summary>/// 传入列表,返回一个元组(索引,列表实体)/// </summary>/// <returns></returns>public static List<(int index , T entity)> GetIndexList<T>(this List<T> list){List<(int index, T entity)> result = new List<(int index, T entity)>();for (int i = 0; i < list.Count; i++){result.Add((i, list[i]));}return result;}/// <summary>/// 列表为null或空列表则返回True/// </summary>/// <returns></returns>public static bool IsNullOrEmpty<T>(this List<T> list){return list == null || !list.Any();}/// <summary>/// 一个实体列表映射到另一个实体列表(属性名称相同则映射)/// </summary>public static List<TTarget> MapToList<TTarget>(this IEnumerable<object> sourceList) where TTarget : new(){var targetList = new List<TTarget>();foreach (var source in sourceList){var target = new TTarget();var sourceProperties = source.GetType().GetProperties(); // 使用实际对象的类型var targetProperties = typeof(TTarget).GetProperties();foreach (var sourceProp in sourceProperties){var targetProp = targetProperties.FirstOrDefault(tp => tp.Name == sourceProp.Name && tp.CanWrite);if (targetProp != null && targetProp.PropertyType == sourceProp.PropertyType){targetProp.SetValue(target, sourceProp.GetValue(source));}}targetList.Add(target);}return targetList;}/// <summary>/// 列表转JSON(string)/// </summary>/// <returns></returns>public static string ConvertToJson<T>(this List<T> sourceList)//可传入列表,实体{var options = new JsonSerializerOptions{Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping // 禁用 Unicode 转义,防止中文字符转义为 Unicode};return JsonSerializer.Serialize(sourceList, options);}}

4.Entity

public static class EntityExtensions
{/// <summary>/// 实体转JSON/// </summary>public static string ConvertToJson<T>(T entity)//可传入列表,实体{var options = new JsonSerializerOptions{Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping // 禁用 Unicode 转义,防止中文字符转义为 Unicode};return JsonSerializer.Serialize(entity, options);}/// <summary>/// 将一个实体映射到另一个实体(属性名称相同且类型匹配的属性将映射)/// </summary>public static TTarget MapToEntity<TTarget>(this object source) where TTarget : new(){var target = new TTarget();var sourceProperties = source.GetType().GetProperties(); // 获取源实体的属性var targetProperties = typeof(TTarget).GetProperties(); // 获取目标实体的属性foreach (var sourceProp in sourceProperties){var targetProp = targetProperties.FirstOrDefault(tp => tp.Name == sourceProp.Name && tp.CanWrite);if (targetProp != null && targetProp.PropertyType == sourceProp.PropertyType){targetProp.SetValue(target, sourceProp.GetValue(source));}}return target;}/// <summary>/// 通过反射设置实体的值/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public static void SetValueByReflect<T>(this T entity, string feildName, object feildValue) where T : class{var feild = typeof(T).GetProperty(feildName);var feildType = feild?.PropertyType;if (feild != null && feildType != null){var valueToSet = Convert.ChangeType(feildValue, feildType);//输入的值类型转化为实体属性的类型feild.SetValue(entity, valueToSet);}}
}


http://www.ppmy.cn/server/161782.html

相关文章

Azure学生订阅上手实操:在Ubuntu VPS上利用Docker快速部署PostgreSQL数据库

引言 本文将详细指导您如何在Azure 100学生订阅中&#xff0c;利用Ubuntu虚拟机&#xff0c;通过Docker容器技术快速搭建PostgreSQL数据库。我们将从Docker和PostgreSQL的基础知识入手&#xff0c;逐步讲解部署过程中的每一个步骤&#xff0c;并提供完整的命令和配置文件示例。…

案例研究丨浪潮云洲通过DataEase推进多维度数据可视化建设

浪潮云洲工业互联网有限公司&#xff08;以下简称为“浪潮云洲”&#xff09;成立于2018年&#xff0c;定位于工业数字基础设施建设商、具有国际影响力的工业互联网平台运营商、生产性互联网头部服务商。截至目前&#xff0c;浪潮云洲工业互联网平台连续五年入选跨行业跨领域工…

进程和线程的区别

进程是程序的一次执行过程&#xff0c;是资源分配的基本单位&#xff1b; 线程是进程中的一个执行单元&#xff0c;是CPU调度的基本单位。 二者的区别如下&#xff1a; 资源分配&#xff1a; 1、进程独有资源。各进程资源隔离&#xff0c;数据不共享。 2、线程共享所属进程…

【数据结构】_链表经典算法OJ:合并两个有序数组

目录 1. 题目描述及链接 2. 解题思路 3. 程序 3.1 第一版 3.2 第二版 1. 题目描述及链接 题目链接&#xff1a;21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给…

如何将pdf文件中的指定页提取出来,另存为新的pdf文件

工作中&#xff0c;我们有时需要将pdf文件中的指定页提取出来&#xff0c;另存为新的pdf文件。 例如&#xff1a;我想提取 example.pdf 的第 [3, 6, 9] 页&#xff0c;然后另存为 new.pdf 。话不多说&#xff0c;上代码&#xff1a; import PyPDF2def split_pdf(input_pdf_pa…

基于DNN深度神经网络的OFDM+QPSK信号检测与误码率matlab仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 在现代通信…

python学opencv|读取图像(四十五)增加掩模:使用cv2.bitwise_and()函数实现图像按位与运算

【1】引言 前序已经对使用cv2.bitwise_and()函数实现图像按位与运算进行了反复探究&#xff1a; python学opencv|读取图像&#xff08;四十三&#xff09;使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客 python学opencv|读取图像&#xff08;四十四&#xff09;原理…

Crawl4AI 人工智能自动采集数据

文章目录 1 使用 Crawl 的步骤2 AI 智能体应用实例3 结语 Crawl是一款免费的开源工具&#xff0c;利用AI技术简化网络爬取和数据提取&#xff0c;提高信息收集与分析的效率。它智能识别网页内容&#xff0c;并将数据转换为易于处理的格式&#xff0c;功能全面且操作简便。 定位…