1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Text;
6
7 namespace xxWare.Common
8 {
9 public static class GenericExtension
10 {
11 #region List<T> search count
12 public static int CountAll<T>(this List<T> _list, T _searchobj)
13 {
14 return (from t in _list where t.Equals(_searchobj) select t).Count();
15 }
16
17 //Must be Sort before use BinarySearchCountAll
18 public static int BinarySearchCountAll<T>(this List<T> _list, T _searchobj)
19 {
20 int center = _list.BinarySearch(_searchobj);
21
22 if (center >= 0)
23 {
24 int left = center;
25
26 while (left > 0 && _list[left - 1].Equals(_searchobj))
27 {
28 left -= 1;
29 }
30
31 int right = center;
32 while (right < (_list.Count - 1) && _list[right + 1].Equals(_searchobj))
33 {
34 right += 1;
35 }
36
37 return (right - left) + 1;
38 }
39 else
40 {
41 return center;
42 }
43 }
44
45 public static List<T> FindAll<T>(this List<T> _list, T _searchobj)
46 {
47 List<T> _founditem = new List<T>();
48
49 foreach (var v in _list)
50 {
51 if (v.Equals(_searchobj))
52 {
53 _founditem.Add(v);
54 }
55 }
56
57 return _founditem;
58 }
59
60 //Must be Sort before use BinarySearchAll
61 public static List<T> BinarySearchAll<T>(this List<T> _list, T _searchobj)
62 {
63 List<T> _retobj = new List<T>();
64
65 int center = _list.BinarySearch(_searchobj);
66
67 if (center >= 0)
68 {
69 _retobj.Add(_list[center]);
70
71 int left = center;
72
73 while (left > 0 && _list[left - 1].Equals(_searchobj))
74 {
75 left -= 1;
76 _retobj.Add(_list[left]);
77 }
78
79 int right = center;
80 while (right < (_list.Count - 1) && _list[right + 1].Equals(_searchobj))
81 {
82 right += 1;
83 _retobj.Add(_list[right]);
84 }
85
86 }
87
88 return _retobj;
89
90 }
91
92 public static List<string> SearchStringAll(this List<string> _list, string _searchstr)
93 {
94 var v = from q in _list
95 where q.Contains(_searchstr)
96 select q;
97 return v.ToList<string>();
98 }
99
100 #endregion
101
102 #region IList<> Sort
103 /// <summary>
104 /// Sample:
105 /// IList<string> iList = new [] { "Carlton", "Alison", "Bob", "Eric", "David" };
106 /// // Sort in-place, by string length
107 /// iList.Sort((s1, s2) => s1.Length.CompareTo(s2.Length));
108 /// // Or use OrderBy()
109 /// IEnumerable<string> ordered = iList.OrderBy((s1, s2) => s1.Length.CompareTo(s2.Length));
110 /// </summary>
111 /// <typeparam name="T"></typeparam>
112 /// <param name="list"></param>
113 /// <param name="comparison"></param>
114 public static void Sort<T>(this IList<T> list, Comparison<T> comparison)
115 {
116 ArrayList.Adapter((IList)list).Sort(new ComparisonComparer<T>(comparison));
117 }
118 public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> list, Comparison<T> comparison)
119 {
120 return list.OrderBy(t => t, new ComparisonComparer<T>(comparison));
121 }
122
123 public class ComparisonComparer<T> : IComparer<T>, IComparer
124 {
125 private readonly Comparison<T> _comparison;
126 public ComparisonComparer(Comparison<T> comparison) { _comparison = comparison; }
127 public int Compare(T x, T y) { return _comparison(x, y); }
128 public int Compare(object o1, object o2) { return _comparison((T)o1, (T)o2); }
129 }
130 #endregion
131
132 }
133 }