Enumerable.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. using System;
  2. using System.Collections.Generic;
  3. namespace MeloongCore.Extensions {
  4. public static class EnumerableExtensions {
  5. /// <summary>
  6. /// 去重。
  7. /// </summary>
  8. public static List<T> Distinct<T>(this IList<T> Arr, Func<T, T, bool> IsEqual) {
  9. var ResultArray = new List<T>();
  10. for (int i = 0; i <= Arr.Count - 1; i++) {
  11. for (int ii = i + 1; ii <= Arr.Count - 1; ii++) {
  12. if (IsEqual(Arr[i], Arr[ii])) { goto NextElement; }
  13. }
  14. ResultArray.Add(Arr[i]);
  15. NextElement:;
  16. }
  17. return ResultArray;
  18. }
  19. /// <summary>
  20. /// 判断这是否是仅有一个元素的集合。
  21. /// </summary>
  22. public static bool IsSingle<T>(this IEnumerable<T> Source) {
  23. if (Source == null) {
  24. return false;
  25. } else if (Source is IList<T> list) {
  26. return list.Count == 1;
  27. } else {
  28. using (var Enumerator = Source.GetEnumerator()) {
  29. if (!Enumerator.MoveNext()) { return false; }
  30. if (Enumerator.MoveNext()) { return false; }
  31. return true;
  32. }
  33. }
  34. }
  35. /// <summary>
  36. /// 对集合的每个元素执行指定操作。
  37. /// </summary>
  38. public static IEnumerable<T> ForEach<T>(this IEnumerable<T> Collection, Action<T> Action) {
  39. foreach (T Item in Collection) {
  40. Action(Item);
  41. }
  42. return Collection;
  43. }
  44. /// <summary>
  45. /// 选择所有最大值对应的对象。
  46. /// 若没有元素则返回空列表。
  47. /// </summary>
  48. public static List<T> MaxByAll<T, C>(this IEnumerable<T> Source, Func<T, C> Selector) where C : IComparable<C> {
  49. var Results = new List<T>();
  50. using (var Enumerator = Source.GetEnumerator()) {
  51. if (!Enumerator.MoveNext()) { return Results; }
  52. T MaxItem = Enumerator.Current;
  53. C MaxValue = Selector(MaxItem);
  54. Results.Add(MaxItem);
  55. while (Enumerator.MoveNext()) {
  56. T CurrentItem = Enumerator.Current;
  57. C CurrentValue = Selector(CurrentItem);
  58. int Comparison = CurrentValue.CompareTo(MaxValue);
  59. if (Comparison > 0) {
  60. MaxValue = CurrentValue;
  61. Results.Clear();
  62. Results.Add(CurrentItem);
  63. } else if (Comparison == 0) {
  64. Results.Add(CurrentItem);
  65. }
  66. }
  67. }
  68. return Results;
  69. }
  70. /// <summary>
  71. /// 选择所有最小值对应的对象。
  72. /// 若没有元素则返回空列表。
  73. /// </summary>
  74. public static List<T> MinByAll<T, C>(this IEnumerable<T> List, Func<T, C> Selector) where C : IComparable<C> {
  75. var Results = new List<T>();
  76. using (var Enumerator = List.GetEnumerator()) {
  77. if (!Enumerator.MoveNext()) { return Results; }
  78. T MinItem = Enumerator.Current;
  79. C MinValue = Selector(MinItem);
  80. Results.Add(MinItem);
  81. while (Enumerator.MoveNext()) {
  82. T CurrentItem = Enumerator.Current;
  83. C CurrentValue = Selector(CurrentItem);
  84. int Comparison = CurrentValue.CompareTo(MinValue);
  85. if (Comparison < 0) {
  86. MinValue = CurrentValue;
  87. Results.Clear();
  88. Results.Add(CurrentItem);
  89. } else if (Comparison == 0) {
  90. Results.Add(CurrentItem);
  91. }
  92. }
  93. }
  94. return Results;
  95. }
  96. /// <summary>
  97. /// 选择最大值对应的对象。
  98. /// 若没有元素则返回 Nothing。
  99. /// </summary>
  100. public static T MaxBy<T, C>(this IEnumerable<T> Source, Func<T, C> Selector) where C : IComparable<C> {
  101. using (var Enumerator = Source.GetEnumerator()) {
  102. if (!Enumerator.MoveNext()) { return default(T); }
  103. T MaxItem = Enumerator.Current;
  104. C MaxValue = Selector(MaxItem);
  105. while (Enumerator.MoveNext()) {
  106. C Value = Selector(Enumerator.Current);
  107. if (Value.CompareTo(MaxValue) <= 0) { continue; }
  108. MaxItem = Enumerator.Current;
  109. MaxValue = Value;
  110. }
  111. return MaxItem;
  112. }
  113. }
  114. /// <summary>
  115. /// 选择最小值对应的对象。
  116. /// 若没有元素则返回 Nothing。
  117. /// </summary>
  118. public static T MinBy<T, C>(this IEnumerable<T> List, Func<T, C> Selector) where C : IComparable<C> {
  119. using (var Enumerator = List.GetEnumerator()) {
  120. if (!Enumerator.MoveNext()) { return default; }
  121. T MinItem = Enumerator.Current;
  122. C MinValue = Selector(MinItem);
  123. while (Enumerator.MoveNext()) {
  124. C Value = Selector(Enumerator.Current);
  125. if (Value.CompareTo(MinValue) >= 0) { continue; }
  126. MinItem = Enumerator.Current;
  127. MinValue = Value;
  128. }
  129. return MinItem;
  130. }
  131. }
  132. }
  133. }