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
原文地址:https://www.cnblogs.com/liuxiaoji/p/4217801.html