当前位置: 首页 > article >正文

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

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.kler.cn/a/516671.html

相关文章:

  • 数据标注开源框架 Label Studio
  • HarmonyOS Next 应用UI生成工具介绍
  • 把 PVE 下的机械硬盘(非SSD系统盘)分配给虚拟机使用
  • linux+docker+nacos+mysql部署
  • 智能化加速标准和协议的更新并推动验证IP(VIP)在芯片设计中的更广泛应用
  • Spring Security(maven项目) 3.0.2.6版本—总
  • ubuntu系统docker环境搭建
  • STM32调试手段:重定向printf串口
  • 重载C++运算符
  • salesforce FIELD_FILTER_VALIDATION_EXCEPTION
  • LVGL+FreeRTOS实战项目:智能健康助手(蓝牙模块篇)
  • 假期day1
  • NPM 与 Node.js 版本兼容问题:npm warn cli npm does not support Node.js
  • 文献阅读 250123-Accelerated dryland expansion under climate change
  • 从 TCP/IP 演进看按序流与性能
  • tortoiseSVN图标缺少绿色钩/tortoiseSVN图标不显示解决方案
  • EDI安全:2025年数据保护与隐私威胁应对策略
  • 【面试】Java 记录一次面试过程 三年工作经验
  • git rebase的使用
  • 在K8S中使用Values文件定制不同环境下的应用配置详解
  • ArrayFire异构计算
  • YOLOv8改进,YOLOv8检测头融合DSConv(动态蛇形卷积),并添加小目标检测层(四头检测),适合目标检测、分割等
  • C++ 入门速通-第1章【黑马】
  • smb共享文件夹当被共享文件的电脑关机了还能正常获取文件吗
  • linux系统centos版本上安装mysql5.7
  • Excel表格转换成PDF文件时显示不全怎么处理?