zoukankan      html  css  js  c++  java
  • Enumerable扩展方法

    主要记录一些平时在工作中用到操作Enumerable的常用方法

      1         /// <summary>
      2         /// The i enumerable extension.
      3         /// </summary>
      4         public static class IEnumerableExtension
      5         {
      6             #region Join
      7             /// <summary>
      8             /// 根据字符串拆分数组
      9             /// </summary>
     10             /// <param name="source">
     11             /// 要拆分的数组
     12             /// </param>
     13             /// <param name="separator">
     14             /// 拆分符
     15             /// </param>
     16             /// <returns>
     17             /// 字符串
     18             /// </returns>
     19             public static string Join(this IEnumerable<string> source, string separator)
     20             {
     21                 if (source == null)
     22                 {
     23                     throw new ArgumentNullException("source");
     24                 }
     25 
     26                 if (separator == null)
     27                 {
     28                     throw new ArgumentNullException("separator");
     29                 }
     30 
     31                 return source.Aggregate((x, y) => x + separator + y);
     32             }
     33 
     34             /// <summary>
     35             /// 根据字符串拆分数组
     36             /// </summary>
     37             /// <typeparam name="TSource">类型</typeparam>
     38             /// <param name="soucre"> 要拆分的数组</param>
     39             /// <param name="separator">拆分符</param>
     40             /// <param name="map">拆分条件</param>
     41             /// <returns>字符串 <see cref="string"/></returns>
     42             public static string Join<TSource>(this IEnumerable<TSource> soucre, string separator, Func<TSource, string> map)
     43             {
     44                 if (soucre == null)
     45                 {
     46                     throw new ArgumentNullException("source");
     47                 }
     48 
     49                 if (separator == null)
     50                 {
     51                     throw new ArgumentNullException("separator");
     52                 }
     53 
     54                 if (map == null)
     55                 {
     56                     throw new ArgumentNullException("map");
     57                 }
     58 
     59                 var enumerable = soucre as TSource[] ?? soucre.ToArray();
     60                 return Join(enumerable.Select(map), separator);
     61             }
     62             #endregion
     63 
     64             #region Sort
     65             /// <summary>
     66             /// 多条件排序扩展方法
     67             /// </summary>
     68             /// <typeparam name="TSource">TSource</typeparam>
     69             /// <param name="sources">sources</param>
     70             /// <param name="keySelector">keySelector</param>
     71             /// <returns>排序结果</returns>
     72             public static IEnumerable<TSource> Sort<TSource>(this IEnumerable<TSource> sources, params KeyValuePair<bool, Func<TSource, object>>[] keySelector)
     73             {
     74                 if (sources == null)
     75                 {
     76                     throw new ArgumentNullException("sources");
     77                 }
     78 
     79                 IOrderedEnumerable<TSource> orderBys = null;
     80                 int i = 0;
     81                 foreach (var func in keySelector)
     82                 {
     83                     if (i == 0)
     84                     {
     85                         orderBys = func.Key ? sources.OrderBy(func.Value) : sources.OrderByDescending(func.Value);
     86                     }
     87                     else
     88                     {
     89                         if (orderBys != null)
     90                         {
     91                             orderBys = func.Key ? orderBys.ThenBy(func.Value) : orderBys.ThenByDescending(func.Value);
     92                         }
     93                     }
     94 
     95                     i++;
     96                 }
     97 
     98                 return orderBys;
     99             }
    100             #endregion
    101 
    102             #region MaxElement
    103             /// <summary>
    104             /// 获取最大值的当前对象
    105             /// </summary>
    106             /// <typeparam name="TElement">TElement</typeparam>
    107             /// <typeparam name="TData">TData</typeparam>
    108             /// <param name="source">source</param>
    109             /// <param name="selector">selector</param>
    110             /// <returns>MaxValue</returns>
    111             public static TElement MaxElement<TElement, TData>(this IEnumerable<TElement> source, Func<TElement, TData> selector)
    112             where TData : IComparable<TData>
    113             {
    114                 return ComparableElement(source, selector, true);
    115             }
    116             #endregion
    117 
    118             #region MinElement
    119             /// <summary>
    120             /// 获取最小值的当前对象
    121             /// </summary>
    122             /// <typeparam name="TElement">TElement</typeparam>
    123             /// <typeparam name="TData">TData</typeparam>
    124             /// <param name="source">source</param>
    125             /// <param name="selector">selector</param>
    126             /// <returns>MaxValue</returns>
    127             public static TElement MinElement<TElement, TData>(this IEnumerable<TElement> source, Func<TElement, TData> selector)
    128             where TData : IComparable<TData>
    129             {
    130                 return ComparableElement(source, selector, false);
    131             }
    132             #endregion
    133 
    134             #region Max
    135             /// <summary>
    136             /// 求最大值
    137             /// </summary>
    138             /// <typeparam name="TSource">TSource</typeparam>
    139             /// <param name="source">source</param>
    140             /// <param name="predicate">predicate</param>
    141             /// <param name="selector">selector</param>
    142             /// <returns>最大值</returns>
    143             public static decimal Max<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, decimal> selector)
    144             {
    145                 if (source == null)
    146                 {
    147                     throw new ArgumentNullException("source");
    148                 }
    149 
    150                 return source.Where(predicate).Select(selector).Max();
    151             }
    152 
    153             /// <summary>
    154             /// 求最大值
    155             /// </summary>
    156             /// <typeparam name="TSource">TSource</typeparam>
    157             /// <param name="source">source</param>
    158             /// <param name="predicate">predicate</param>
    159             /// <param name="selector">selector</param>
    160             /// <returns>最大值</returns>
    161             public static double Max<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, double> selector)
    162             {
    163                 if (source == null)
    164                 {
    165                     throw new ArgumentNullException("source");
    166                 }
    167 
    168                 return source.Where(predicate).Select(selector).Max();
    169             }
    170 
    171             /// <summary>
    172             /// 求最大值
    173             /// </summary>
    174             /// <typeparam name="TSource">TSource</typeparam>
    175             /// <param name="source">source</param>
    176             /// <param name="predicate">predicate</param>
    177             /// <param name="selector">selector</param>
    178             /// <returns>最大值</returns>
    179             public static int Max<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, int> selector)
    180             {
    181                 if (source == null)
    182                 {
    183                     throw new ArgumentNullException("source");
    184                 }
    185 
    186                 return source.Where(predicate).Select(selector).Max();
    187             }
    188 
    189             /// <summary>
    190             /// 求最大值
    191             /// </summary>
    192             /// <typeparam name="TSource">TSource</typeparam>
    193             /// <param name="source">source</param>
    194             /// <param name="predicate">predicate</param>
    195             /// <param name="selector">selector</param>
    196             /// <returns>最大值</returns>
    197             public static long Max<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, long> selector)
    198             {
    199                 if (source == null)
    200                 {
    201                     throw new ArgumentNullException("source");
    202                 }
    203 
    204                 return source.Where(predicate).Select(selector).Max();
    205             }
    206 
    207             /// <summary>
    208             /// 求最大值
    209             /// </summary>
    210             /// <typeparam name="TSource">TSource</typeparam>
    211             /// <param name="source">source</param>
    212             /// <param name="predicate">predicate</param>
    213             /// <param name="selector">selector</param>
    214             /// <returns>最大值</returns>
    215             public static float Max<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, float> selector)
    216             {
    217                 if (source == null)
    218                 {
    219                     throw new ArgumentNullException("source");
    220                 }
    221 
    222                 return source.Where(predicate).Select(selector).Max();
    223             }
    224 
    225             /// <summary>
    226             /// 求最大值
    227             /// </summary>
    228             /// <typeparam name="TSource">TSource</typeparam>
    229             /// <param name="source">source</param>
    230             /// <param name="predicate">predicate</param>
    231             /// <param name="selector">selector</param>
    232             /// <returns>最大值</returns>
    233             public static decimal? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, decimal?> selector)
    234             {
    235                 if (source == null)
    236                 {
    237                     throw new ArgumentNullException("source");
    238                 }
    239 
    240                 return source.Where(predicate).Select(selector).Max();
    241             }
    242 
    243             /// <summary>
    244             /// 求最大值
    245             /// </summary>
    246             /// <typeparam name="TSource">TSource</typeparam>
    247             /// <param name="source">source</param>
    248             /// <param name="predicate">predicate</param>
    249             /// <param name="selector">selector</param>
    250             /// <returns>最大值</returns>
    251             public static double? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, double?> selector)
    252             {
    253                 if (source == null)
    254                 {
    255                     throw new ArgumentNullException("source");
    256                 }
    257 
    258                 return source.Where(predicate).Select(selector).Max();
    259             }
    260 
    261             /// <summary>
    262             /// 求最大值
    263             /// </summary>
    264             /// <typeparam name="TSource">TSource</typeparam>
    265             /// <param name="source">source</param>
    266             /// <param name="predicate">predicate</param>
    267             /// <param name="selector">selector</param>
    268             /// <returns>最大值</returns>
    269             public static int? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, int?> selector)
    270             {
    271                 if (source == null)
    272                 {
    273                     throw new ArgumentNullException("source");
    274                 }
    275 
    276                 return source.Where(predicate).Select(selector).Max();
    277             }
    278 
    279             /// <summary>
    280             /// 求最大值
    281             /// </summary>
    282             /// <typeparam name="TSource">TSource</typeparam>
    283             /// <param name="source">source</param>
    284             /// <param name="predicate">predicate</param>
    285             /// <param name="selector">selector</param>
    286             /// <returns>最大值</returns>
    287             public static long? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, long?> selector)
    288             {
    289                 if (source == null)
    290                 {
    291                     throw new ArgumentNullException("source");
    292                 }
    293 
    294                 return source.Where(predicate).Select(selector).Max();
    295             }
    296 
    297             /// <summary>
    298             /// 求最大值
    299             /// </summary>
    300             /// <typeparam name="TSource">TSource</typeparam>
    301             /// <param name="source">source</param>
    302             /// <param name="predicate">predicate</param>
    303             /// <param name="selector">selector</param>
    304             /// <returns>最大值</returns>
    305             public static float? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, float?> selector)
    306             {
    307                 if (source == null)
    308                 {
    309                     throw new ArgumentNullException("source");
    310                 }
    311 
    312                 return source.Where(predicate).Select(selector).Max();
    313             }
    314             #endregion
    315 
    316             #region Min
    317             /// <summary>
    318             /// 求最小值
    319             /// </summary>
    320             /// <typeparam name="TSource">TSource</typeparam>
    321             /// <param name="source">source</param>
    322             /// <param name="predicate">predicate</param>
    323             /// <param name="selector">selector</param>
    324             /// <returns>最小值</returns>
    325             public static decimal Min<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, decimal> selector)
    326             {
    327                 if (source == null)
    328                 {
    329                     throw new ArgumentNullException("source");
    330                 }
    331 
    332                 return source.Where(predicate).Select(selector).Min();
    333             }
    334 
    335             /// <summary>
    336             /// 求最小值
    337             /// </summary>
    338             /// <typeparam name="TSource">TSource</typeparam>
    339             /// <param name="source">source</param>
    340             /// <param name="predicate">predicate</param>
    341             /// <param name="selector">selector</param>
    342             /// <returns>最小值</returns>
    343             public static double Min<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, double> selector)
    344             {
    345                 if (source == null)
    346                 {
    347                     throw new ArgumentNullException("source");
    348                 }
    349 
    350                 return source.Where(predicate).Select(selector).Min();
    351             }
    352 
    353             /// <summary>
    354             /// 求最小值
    355             /// </summary>
    356             /// <typeparam name="TSource">TSource</typeparam>
    357             /// <param name="source">source</param>
    358             /// <param name="predicate">predicate</param>
    359             /// <param name="selector">selector</param>
    360             /// <returns>最小值</returns>
    361             public static int Min<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, int> selector)
    362             {
    363                 if (source == null)
    364                 {
    365                     throw new ArgumentNullException("source");
    366                 }
    367 
    368                 return source.Where(predicate).Select(selector).Min();
    369             }
    370 
    371             /// <summary>
    372             /// 求最小值
    373             /// </summary>
    374             /// <typeparam name="TSource">TSource</typeparam>
    375             /// <param name="source">source</param>
    376             /// <param name="predicate">predicate</param>
    377             /// <param name="selector">selector</param>
    378             /// <returns>最小值</returns>
    379             public static long Min<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, long> selector)
    380             {
    381                 if (source == null)
    382                 {
    383                     throw new ArgumentNullException("source");
    384                 }
    385 
    386                 return source.Where(predicate).Select(selector).Min();
    387             }
    388 
    389             /// <summary>
    390             /// 求最小值
    391             /// </summary>
    392             /// <typeparam name="TSource">TSource</typeparam>
    393             /// <param name="source">source</param>
    394             /// <param name="predicate">predicate</param>
    395             /// <param name="selector">selector</param>
    396             /// <returns>最小值</returns>
    397             public static float Min<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, float> selector)
    398             {
    399                 if (source == null)
    400                 {
    401                     throw new ArgumentNullException("source");
    402                 }
    403 
    404                 return source.Where(predicate).Select(selector).Min();
    405             }
    406 
    407             /// <summary>
    408             /// 求最小值
    409             /// </summary>
    410             /// <typeparam name="TSource">TSource</typeparam>
    411             /// <param name="source">source</param>
    412             /// <param name="predicate">predicate</param>
    413             /// <param name="selector">selector</param>
    414             /// <returns>最小值</returns>
    415             public static decimal? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, decimal?> selector)
    416             {
    417                 if (source == null)
    418                 {
    419                     throw new ArgumentNullException("source");
    420                 }
    421 
    422                 return source.Where(predicate).Select(selector).Min();
    423             }
    424 
    425             /// <summary>
    426             /// 求最小值
    427             /// </summary>
    428             /// <typeparam name="TSource">TSource</typeparam>
    429             /// <param name="source">source</param>
    430             /// <param name="predicate">predicate</param>
    431             /// <param name="selector">selector</param>
    432             /// <returns>最小值</returns>
    433             public static double? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, double?> selector)
    434             {
    435                 if (source == null)
    436                 {
    437                     throw new ArgumentNullException("source");
    438                 }
    439 
    440                 return source.Where(predicate).Select(selector).Min();
    441             }
    442 
    443             /// <summary>
    444             /// 求最小值
    445             /// </summary>
    446             /// <typeparam name="TSource">TSource</typeparam>
    447             /// <param name="source">source</param>
    448             /// <param name="predicate">predicate</param>
    449             /// <param name="selector">selector</param>
    450             /// <returns>最小值</returns>
    451             public static int? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, int?> selector)
    452             {
    453                 if (source == null)
    454                 {
    455                     throw new ArgumentNullException("source");
    456                 }
    457 
    458                 return source.Where(predicate).Select(selector).Min();
    459             }
    460 
    461             /// <summary>
    462             /// 求最小值
    463             /// </summary>
    464             /// <typeparam name="TSource">TSource</typeparam>
    465             /// <param name="source">source</param>
    466             /// <param name="predicate">predicate</param>
    467             /// <param name="selector">selector</param>
    468             /// <returns>最小值</returns>
    469             public static long? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, long?> selector)
    470             {
    471                 if (source == null)
    472                 {
    473                     throw new ArgumentNullException("source");
    474                 }
    475 
    476                 return source.Where(predicate).Select(selector).Min();
    477             }
    478 
    479             /// <summary>
    480             /// 求最小值
    481             /// </summary>
    482             /// <typeparam name="TSource">TSource</typeparam>
    483             /// <param name="source">source</param>
    484             /// <param name="predicate">predicate</param>
    485             /// <param name="selector">selector</param>
    486             /// <returns>最小值</returns>
    487             public static float? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, float?> selector)
    488             {
    489                 if (source == null)
    490                 {
    491                     throw new ArgumentNullException("source");
    492                 }
    493 
    494                 return source.Where(predicate).Select(selector).Min();
    495             }
    496             #endregion
    497 
    498             #region Sum
    499             /// <summary>
    500             /// 求和
    501             /// </summary>
    502             /// <typeparam name="TSource">TSource</typeparam>
    503             /// <param name="source">source</param>
    504             /// <param name="predicate">predicate</param>
    505             /// <param name="selector">selector</param>
    506             /// <returns></returns>
    507             public static decimal Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, decimal> selector)
    508             {
    509                 if (source == null)
    510                 {
    511                     throw new ArgumentNullException("source");
    512                 }
    513 
    514                 return source.Where(predicate).Select(selector).Sum();
    515             }
    516 
    517             /// <summary>
    518             /// 求和
    519             /// </summary>
    520             /// <typeparam name="TSource">TSource</typeparam>
    521             /// <param name="source">source</param>
    522             /// <param name="predicate">predicate</param>
    523             /// <param name="selector">selector</param>
    524             /// <returns></returns>
    525             public static double Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, double> selector)
    526             {
    527                 if (source == null)
    528                 {
    529                     throw new ArgumentNullException("source");
    530                 }
    531 
    532                 return source.Where(predicate).Select(selector).Sum();
    533             }
    534 
    535             /// <summary>
    536             /// 求和
    537             /// </summary>
    538             /// <typeparam name="TSource">TSource</typeparam>
    539             /// <param name="source">source</param>
    540             /// <param name="predicate">predicate</param>
    541             /// <param name="selector">selector</param>
    542             /// <returns></returns>
    543             public static int Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, int> selector)
    544             {
    545                 if (source == null)
    546                 {
    547                     throw new ArgumentNullException("source");
    548                 }
    549 
    550                 return source.Where(predicate).Select(selector).Sum();
    551             }
    552 
    553             /// <summary>
    554             /// 求和
    555             /// </summary>
    556             /// <typeparam name="TSource">TSource</typeparam>
    557             /// <param name="source">source</param>
    558             /// <param name="predicate">predicate</param>
    559             /// <param name="selector">selector</param>
    560             /// <returns></returns>
    561             public static long Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, long> selector)
    562             {
    563                 if (source == null)
    564                 {
    565                     throw new ArgumentNullException("source");
    566                 }
    567 
    568                 return source.Where(predicate).Select(selector).Sum();
    569             }
    570 
    571             /// <summary>
    572             /// 求和
    573             /// </summary>
    574             /// <typeparam name="TSource">TSource</typeparam>
    575             /// <param name="source">source</param>
    576             /// <param name="predicate">predicate</param>
    577             /// <param name="selector">selector</param>
    578             /// <returns></returns>
    579             public static float Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, float> selector)
    580             {
    581                 if (source == null)
    582                 {
    583                     throw new ArgumentNullException("source");
    584                 }
    585 
    586                 return source.Where(predicate).Select(selector).Sum();
    587             }
    588 
    589             /// <summary>
    590             /// 求和
    591             /// </summary>
    592             /// <typeparam name="TSource">TSource</typeparam>
    593             /// <param name="source">source</param>
    594             /// <param name="predicate">predicate</param>
    595             /// <param name="selector">selector</param>
    596             /// <returns></returns>
    597             public static decimal? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, decimal?> selector)
    598             {
    599                 if (source == null)
    600                 {
    601                     throw new ArgumentNullException("source");
    602                 }
    603 
    604                 return source.Where(predicate).Select(selector).Sum(result => result.GetValueOrDefault());
    605             }
    606 
    607             /// <summary>
    608             /// 求和
    609             /// </summary>
    610             /// <typeparam name="TSource">TSource</typeparam>
    611             /// <param name="source">source</param>
    612             /// <param name="predicate">predicate</param>
    613             /// <param name="selector">selector</param>
    614             /// <returns></returns>
    615             public static double? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, double?> selector)
    616             {
    617                 if (source == null)
    618                 {
    619                     throw new ArgumentNullException("source");
    620                 }
    621 
    622                 return source.Where(predicate).Select(selector).Sum();
    623             }
    624 
    625             /// <summary>
    626             /// 求和
    627             /// </summary>
    628             /// <typeparam name="TSource">TSource</typeparam>
    629             /// <param name="source">source</param>
    630             /// <param name="predicate">predicate</param>
    631             /// <param name="selector">selector</param>
    632             /// <returns></returns>
    633             public static int? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, int?> selector)
    634             {
    635                 if (source == null)
    636                 {
    637                     throw new ArgumentNullException("source");
    638                 }
    639 
    640                 return source.Where(predicate).Select(selector).Sum();
    641             }
    642 
    643             /// <summary>
    644             /// 求和
    645             /// </summary>
    646             /// <typeparam name="TSource">TSource</typeparam>
    647             /// <param name="source">source</param>
    648             /// <param name="predicate">predicate</param>
    649             /// <param name="selector">selector</param>
    650             /// <returns></returns>
    651             public static long? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, long?> selector)
    652             {
    653                 if (source == null)
    654                 {
    655                     throw new ArgumentNullException("source");
    656                 }
    657 
    658                 return source.Where(predicate).Select(selector).Sum();
    659             }
    660 
    661             /// <summary>
    662             /// 求和
    663             /// </summary>
    664             /// <typeparam name="TSource">TSource</typeparam>
    665             /// <param name="source">source</param>
    666             /// <param name="predicate">predicate</param>
    667             /// <param name="selector">selector</param>
    668             /// <returns></returns>
    669             public static float? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, float?> selector)
    670             {
    671                 if (source == null)
    672                 {
    673                     throw new ArgumentNullException("source");
    674                 }
    675 
    676                 return source.Where(predicate).Select(selector).Sum();
    677             }
    678 
    679             #endregion
    680 
    681             #region private
    682             /// <summary>
    683             /// 获取最大or最小值的当前对象
    684             /// </summary>
    685             /// <typeparam name="TElement">TElement</typeparam>
    686             /// <typeparam name="TData">TData</typeparam>
    687             /// <param name="source">source</param>
    688             /// <param name="selector">selector</param>
    689             /// <param name="isMax">最大还是最小</param>
    690             /// <returns>MaxValue</returns>
    691             private static TElement ComparableElement<TElement, TData>(IEnumerable<TElement> source, Func<TElement, TData> selector, bool isMax)
    692             where TData : IComparable<TData>
    693             {
    694                 if (source == null)
    695                 {
    696                     throw new ArgumentNullException("source");
    697                 }
    698 
    699                 if (selector == null)
    700                 {
    701                     throw new ArgumentNullException("selector");
    702                 }
    703 
    704                 bool firstElement = true;
    705                 TElement result = default(TElement);
    706                 TData maxValue = default(TData);
    707                 foreach (TElement element in source)
    708                 {
    709                     var candidate = selector(element);
    710                     if (!firstElement)
    711                     {
    712                         if (isMax && candidate.CompareTo(maxValue) <= 0)
    713                         {
    714                             continue;
    715                         }
    716 
    717                         if (!isMax && candidate.CompareTo(maxValue) > 0)
    718                         {
    719                             continue;
    720                         }
    721                     }
    722 
    723                     firstElement = false;
    724                     maxValue = candidate;
    725                     result = element;
    726                 }
    727 
    728                 return result;
    729             }
    730             #endregion
    731 
    732             #region 拆分字符串
    733             /// <summary>
    734             /// 根据字符串拆分字符串
    735             /// </summary>
    736             /// <param name="source">要拆分的字符串</param>
    737             /// <param name="separator">拆分符</param>
    738             /// <returns>数组</returns>
    739             public static string[] Split(this string source, string separator)
    740             {
    741                 if (source == null)
    742                 {
    743                     throw new ArgumentNullException("source");
    744                 }
    745 
    746                 if (separator == null)
    747                 {
    748                     throw new ArgumentNullException("separator");
    749                 }
    750 
    751                 string[] strtmp = new string[1];
    752                 // ReSharper disable once StringIndexOfIsCultureSpecific.2
    753                 int index = source.IndexOf(separator, 0);
    754                 if (index < 0)
    755                 {
    756                     strtmp[0] = source;
    757                     return strtmp;
    758                 }
    759 
    760                 strtmp[0] = source.Substring(0, index);
    761                 return Split(source.Substring(index + separator.Length), separator, strtmp);
    762             }
    763 
    764             /// <summary>
    765             /// 采用递归将字符串分割成数组
    766             /// </summary>
    767             /// <param name="source">要拆分的字符串</param>
    768             /// <param name="separator">拆分符</param>
    769             /// <param name="attachArray">attachArray</param>
    770             /// <returns>string[]</returns>
    771             private static string[] Split(string source, string separator, string[] attachArray)
    772             {
    773                 // while循环的方式
    774                 while (true)
    775                 {
    776                     string[] strtmp = new string[attachArray.Length + 1];
    777                     attachArray.CopyTo(strtmp, 0);
    778 
    779                     // ReSharper disable once StringIndexOfIsCultureSpecific.2
    780                     int index = source.IndexOf(separator, 0);
    781                     if (index < 0)
    782                     {
    783                         strtmp[attachArray.Length] = source;
    784                         return strtmp;
    785                     }
    786 
    787                     strtmp[attachArray.Length] = source.Substring(0, index);
    788                     source = source.Substring(index + separator.Length);
    789                     attachArray = strtmp;
    790                 }
    791 
    792                 // 递归的方式
    793                 /*
    794                 string[] strtmp = new string[attachArray.Length + 1];
    795                  attachArray.CopyTo(strtmp, 0);
    796  
    797                 // ReSharper disable once StringIndexOfIsCultureSpecific.2
    798                  int index = source.IndexOf(separator, 0);
    799                  if (index < 0)
    800                  {
    801                  strtmp[attachArray.Length] = source;
    802                  return strtmp;
    803                  }
    804                  else
    805                  {
    806                  strtmp[attachArray.Length] = source.Substring(0, index);
    807                  return Split(source.Substring(index + separator.Length), separator, strtmp);
    808                  }*/
    809             }
    810 
    811             #endregion
    812 
    813             /// <summary>
    814             /// JavaScript方式序列化json
    815             /// </summary>
    816             /// <param name="obj">输出对象</param>
    817             /// <returns>JSON字符串</returns>
    818             public static string Serialization(this object obj)
    819             {
    820                 JavaScriptSerializer json = new JavaScriptSerializer();
    821                 return json.Serialize(obj);
    822             }
    823 
    824             /// <summary>
    825             /// 获取Json的Model(反序列化)
    826             /// </summary>
    827             /// <typeparam name="T">对象类型</typeparam>
    828             /// <param name="json">json字符串</param>
    829             /// <returns>T对象</returns>
    830             public static T Deserializ<T>(this string json)
    831             {
    832                 T t = default(T);
    833                 try
    834                 {
    835                     JavaScriptSerializer serializer = new JavaScriptSerializer();
    836                     return serializer.Deserialize<T>(json);
    837                 }
    838                 catch (Exception)
    839                 {
    840                     return t;
    841                 }
    842             }
    843 
    844             /// <summary>
    845             /// XML序列化方式深复制
    846             /// </summary>
    847             /// <typeparam name="T">类型</typeparam>
    848             /// <param name="obj">复制对象</param>
    849             /// <returns>结果</returns>
    850             public static T DeepCopy<T>(this T obj)
    851             {
    852                 object retval;
    853                 using (MemoryStream ms = new MemoryStream())
    854                 {
    855                     XmlSerializer xml = new XmlSerializer(typeof(T));
    856                     xml.Serialize(ms, obj);
    857                     ms.Seek(0, SeekOrigin.Begin);
    858                     retval = xml.Deserialize(ms);
    859                     ms.Close();
    860                 }
    861 
    862                 return (T)retval;
    863             }
    864         }
    View Code
  • 相关阅读:
    【NOIp模拟赛】种花
    【NOIP模拟赛】质数序列
    【NOIp模拟赛】兔子
    【NOIp模拟赛】圆桌游戏
    【NOIp模拟赛】花
    【洛谷P2345】奶牛集会
    【洛谷P1774】最接近神的人_NOI导刊2010提高(02)
    【洛谷P1495】 曹冲养猪
    【洛谷P1287】 盒子与球
    NOIP2009 Hankson 的趣味题
  • 原文地址:https://www.cnblogs.com/liuxiaoji/p/4217801.html
Copyright © 2011-2022 走看看