<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      集合根據不同字段名稱動態實現排序

        1 using System;
        2 using System.Collections.Generic;
        3 using System.Linq;
        4 using System.Linq.Expressions;
        5 using System.Reflection;
        6 using System.Security.Cryptography.X509Certificates;
        7 using System.Text;
        8 using System.Threading.Tasks;
        9 
       10 namespace System.Collections.Generic
       11 {
       12     public static class IEnumerableExtension
       13     {
       14         /// <summary>
       15         /// 排序
       16         /// 動態生成linq表達式,并手動調用排序方法OrderBy、OrderByDescending
       17         /// </summary>
       18         /// <typeparam name="T">實體類型</typeparam>
       19         /// <param name="source">源數據集合</param>
       20         /// <param name="sort">排序字段 例如:Id asc;Name desc</param>
       21         /// <returns></returns>
       22         /// <exception cref="ArgumentNullException">源數據集合不能為空</exception>
       23         /// <exception cref="InvalidOperationException">排序字段必須是實體屬性名稱</exception>
       24         public static IEnumerable<T> ApplySort<T>(this IEnumerable<T> source, string sort) where T : class, new()
       25         {
       26             if (source == null)
       27                 throw new ArgumentNullException(nameof(source));
       28 
       29             if (string.IsNullOrWhiteSpace(sort))
       30                 return source;
       31 
       32             var type = typeof(T);
       33             var sortVector = sort.ToLower().Split(' ', StringSplitOptions.RemoveEmptyEntries);
       34             /*
       35              * 注意:要使BindingFlags.IgnoreCase生效,必須搭配BindingFlags.Instance和BindingFlags.Public一起使用
       36              */
       37             var property = type.GetProperty(sortVector[0], BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase) ?? throw new InvalidOperationException("unknown sort field.");
       38             var parameter = Expression.Parameter(type, "x");
       39             var propertyAccess = Expression.MakeMemberAccess(parameter, property);
       40             var orderByExp = Expression.Lambda(propertyAccess, parameter);
       41 
       42             var queryable = source.AsQueryable();
       43             MethodCallExpression resultExp = Expression.Call(typeof(Queryable),
       44              sortVector.Length == 1 ? "OrderBy" : "asc".Equals(sortVector[1]) ? "OrderBy" : "OrderByDescending",
       45              new Type[] { type, property.PropertyType },
       46              queryable.Expression,
       47              Expression.Quote(orderByExp));
       48 
       49             var sortedQuery = queryable.Provider.CreateQuery(resultExp);
       50             var sortedList = sortedQuery.Cast<T>().ToList();
       51             return sortedList;
       52         }
       53 
       54         /// <summary>
       55         /// 排序
       56         /// 利用Linq本身的OrderBy、OrderByDescending方法進行排序,根據字段名稱反射獲取屬性值
       57         /// </summary>
       58         /// <typeparam name="T">實體類型</typeparam>
       59         /// <param name="source">源數據集合</param>
       60         /// <param name="sort">排序字段 例如:Id asc;Name des</param>
       61         /// <returns></returns>
       62         /// <exception cref="ArgumentNullException">源數據集合不能為空</exception>
       63         /// <exception cref="InvalidOperationException">排序字段必須是實體屬性名稱</exception>
       64         public static IEnumerable<T> ApplyLinqSort<T>(this IEnumerable<T> source, string sort) where T : class, new()
       65         {
       66             if (source == null)
       67                 throw new ArgumentNullException(nameof(source));
       68 
       69             if (string.IsNullOrWhiteSpace(sort))
       70                 return source;
       71 
       72             var sortVector = sort.ToLower().Split(' ', StringSplitOptions.RemoveEmptyEntries);
       73             string sortField = sortVector[0], sortFlag = sortVector.Length > 1 ? sortVector[1] : "asc";
       74             return "asc".Equals(sortFlag) ?
       75                        source.OrderBy(o => o?.GetType().GetProperty(sortField, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase)?.GetValue(o) ?? throw new InvalidOperationException("unknown sort field.")) :
       76                        source.OrderByDescending(o => o?.GetType().GetProperty(sortField, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase)?.GetValue(o) ?? throw new InvalidOperationException("unknown sort field."));
       77         }
       78 
       79         /// <summary>
       80         /// 排序
       81         /// 利用List集合的Sort方法進行排序
       82         /// </summary>
       83         /// <typeparam name="T">實體類型</typeparam>
       84         /// <param name="source">源數據集合</param>
       85         /// <param name="sort">排序字段 例如:Id asc;Name des</param>
       86         /// <returns></returns>
       87         /// <exception cref="ArgumentNullException">源數據集合不能為空</exception>
       88         /// <exception cref="InvalidOperationException">排序字段必須是實體屬性名稱</exception>
       89         public static IEnumerable<T> ApplyReflectSort<T>(this IEnumerable<T> source, string sort) where T : class, new()
       90         {
       91             if (source == null)
       92                 throw new ArgumentNullException(nameof(source));
       93 
       94             if (string.IsNullOrWhiteSpace(sort))
       95                 return source;
       96 
       97             var sortVector = sort.ToLower().Split(' ', StringSplitOptions.RemoveEmptyEntries);
       98             string sortField = sortVector[0], sortFlag = sortVector.Length > 1 ? sortVector[1] : "asc";
       99             var type = typeof(T);
      100             PropertyInfo property = type.GetProperty(sortField, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase) ?? throw new InvalidOperationException("unknown sort field.");
      101             var list = source.ToList();
      102             list.Sort((T before, T after) =>
      103             {
      104                 return "asc".Equals(sortFlag) ?
      105                 property.GetValue(before).CompareTo(property.GetValue(after)) :
      106                 property.GetValue(after).CompareTo(property.GetValue(before));
      107             });
      108             return list;
      109         }
      110 
      111         static int CompareTo(this object? source, object? value)
      112         {
      113             if (source == null || value == null)
      114                 return 0;
      115 
      116             var sTypeName = source.GetType().Name.ToLower();
      117             var cTypeName = value.GetType().Name.ToLower();
      118             if (sTypeName != cTypeName)
      119                 throw new InvalidOperationException("the type of them is different,they can't be compared.");
      120 
      121             return sTypeName switch
      122             {
      123                 "int16" => Convert.ToInt16(source).CompareTo(Convert.ToInt16(value)),
      124                 "int" or "int32" => Convert.ToInt32(source).CompareTo(Convert.ToInt32(value)),
      125                 "int64" => Convert.ToInt64(source).CompareTo(Convert.ToInt64(value)),
      126                 "double" => Convert.ToDouble(source).CompareTo(Convert.ToDouble(value)),
      127                 "single" => Convert.ToSingle(source).CompareTo(Convert.ToSingle(value)),
      128                 "decimal" => Convert.ToDecimal(source).CompareTo(Convert.ToDecimal(value)),
      129                 "string" => Convert.ToString(source)?.CompareTo(Convert.ToString(value)) ?? 0,
      130                 "datetime" => Convert.ToDateTime(source).CompareTo(Convert.ToDateTime(value)),
      131                 _ => throw new NotImplementedException("unknown compare type."),
      132             };
      133         }
      134     }
      135 }

       

      posted on 2024-07-19 10:20  DreamerSix  閱讀(12)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 国产午夜福利免费入口| 日日猛噜噜狠狠扒开双腿小说| AV无码免费不卡在线观看| 亚洲中文字幕日产无码成人片| 国内精品大秀视频日韩精品| 日日爽日日操| 精品国产亚洲一区二区三区| 亚洲中文字幕无码av永久| av中文无码乱人伦在线观看| 国产日韩综合av在线| 中文字幕国产日韩精品| 国产一级精品在线免费看| 中文文字幕文字幕亚洲色| 国偷自产av一区二区三区| 精品国精品国产自在久国产应用男| 手机看片日本在线观看视频| 亚洲精品美女久久7777777| 国产一区二区三区尤物视频| 影音先锋啪啪av资源网站| 欧美、另类亚洲日本一区二区| 久久精品国产99亚洲精品| 少妇被粗大的猛进出69影院| 辽阳县| 亚洲女同性同志熟女| 国产午夜福利免费入口| 免费又黄又爽1000禁片| 日韩国产精品一区二区av| 国产精品色哟哟在线观看| 茄子视频国产在线观看| 日韩熟妇中文色在线视频 | 亚洲AV高清一区二区三区尤物| 亚洲一精品一区二区三区| 四虎影视一区二区精品| 中文字幕少妇人妻精品| 国产一区二区在线激情往| 国产亚洲精品久久久久5区| 免费看一区无码无a片www| 97精品伊人久久大香线蕉APP| 国产亚洲人成网站在线观看| 日韩精品视频一二三四区| 精品 无码 国产观看|