2
0
Эх сурвалжийг харах

ref: 整理 String 扩展

龙腾猫跃 6 сар өмнө
parent
commit
0b760209fd

+ 40 - 2
Extensions/Enumerable.cs → Extensions/EnumerableExtensions.cs

@@ -1,11 +1,13 @@
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
+using System.Text;
 
 namespace MeloongCore.Extensions {
     public static class EnumerableExtensions {
 
-        #region 去重
+        #region Distinct
 
         /// <summary>
         /// 通过比较器进行去重。
@@ -28,7 +30,7 @@ namespace MeloongCore.Extensions {
 
         #endregion
 
-        #region 取最大、最小值
+        #region MinBy / MaxBy
 
         /// <summary>
         /// 选择所有最大值对应的对象。
@@ -122,6 +124,42 @@ namespace MeloongCore.Extensions {
 
         #endregion
 
+        #region Join
+
+        /// <summary>
+        /// 用指定的分割符将集合连接为字符串。
+        /// </summary>
+        public static string Join(this IEnumerable list, char split) {
+            StringBuilder builder = new StringBuilder();
+            bool isFirst = true;
+            foreach (var element in list) {
+                if (isFirst)
+                    isFirst = false;
+                else
+                    builder.Append(split);
+                if (element != null) builder.Append(element.ToString());
+            }
+            return builder.ToString();
+        }
+        /// <summary>
+        /// 用指定的分割符将集合连接为字符串。
+        /// </summary>
+        public static string Join(this IEnumerable list, string split) {
+            if (split.IsSingle()) return list.Join(split[0]);
+            StringBuilder builder = new StringBuilder();
+            bool isFirst = true;
+            foreach (var element in list) {
+                if (isFirst)
+                    isFirst = false;
+                else
+                    builder.Append(split);
+                if (element != null) builder.Append(element.ToString());
+            }
+            return builder.ToString();
+        }
+
+        #endregion
+
         /// <summary>
         /// 判断集合是否有且仅有一个元素。
         /// </summary>

+ 0 - 63
Extensions/String.cs

@@ -1,63 +0,0 @@
-using System;
-using System.Runtime.CompilerServices;
-
-namespace MeloongCore.Extensions {
-    public static class StringExtensions {
-
-        /// <summary>
-        /// 高速的 StartsWith。
-        /// </summary>
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static bool StartsWithF(this string value, string prefix, bool ignoreCase = false) {
-            if (value == null) return false;
-            return value.StartsWith(prefix, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
-        }
-        /// <summary>
-        /// 高速的 EndsWith。
-        /// </summary>
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static bool EndsWithF(this string value, string suffix, bool ignoreCase = false) {
-            if (value == null) return false;
-            return value.EndsWith(suffix, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
-        }
-
-        /// <summary>
-        /// 忽略大小写的 Contains。
-        /// </summary>
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static bool ContainsIgnoreCase(this string value, string subString) {
-            return value.IndexOf(subString, StringComparison.OrdinalIgnoreCase) >= 0;
-        }
-
-        /// <summary>
-        /// 高速的 IndexOf。
-        /// </summary>
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static int IndexOfF(this string value, string subString, bool ignoreCase = false) {
-            return value.IndexOf(subString, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
-        }
-        /// <summary>
-        /// 高速的 IndexOf。
-        /// </summary>
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static int IndexOfF(this string value, string subString, int startIndex, bool ignoreCase = false) {
-            return value.IndexOf(subString, startIndex, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
-        }
-
-        /// <summary>
-        /// 高速的 LastIndexOf。
-        /// </summary>
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static int LastIndexOfF(this string value, string subString, bool ignoreCase = false) {
-            return value.LastIndexOf(subString, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
-        }
-        /// <summary>
-        /// 高速的 LastIndexOf。
-        /// </summary>
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static int LastIndexOfF(this string value, string subString, int startIndex, bool ignoreCase = false) {
-            return value.LastIndexOf(subString, startIndex, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
-        }
-
-    }
-}

+ 168 - 0
Extensions/StringExtensions.cs

@@ -0,0 +1,168 @@
+using System;
+using System.Runtime.CompilerServices;
+
+namespace MeloongCore.Extensions {
+    public static class StringExtensions {
+
+        #region 区域性 / 大小写 简化
+
+        /// <summary>
+        /// 高速的 StartsWith。
+        /// </summary>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static bool StartsWithF(this string value, string prefix, bool ignoreCase = false) {
+            if (value == null) return false;
+            return value.StartsWith(prefix, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
+        }
+        /// <summary>
+        /// 高速的 EndsWith。
+        /// </summary>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static bool EndsWithF(this string value, string suffix, bool ignoreCase = false) {
+            if (value == null) return false;
+            return value.EndsWith(suffix, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
+        }
+
+        /// <summary>
+        /// 忽略大小写的 Contains。
+        /// </summary>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static bool ContainsIgnoreCase(this string value, string subString) {
+            return value.IndexOf(subString, StringComparison.OrdinalIgnoreCase) >= 0;
+        }
+
+        /// <summary>
+        /// 高速的 IndexOf。
+        /// </summary>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static int IndexOfF(this string value, string subString, bool ignoreCase = false) {
+            return value.IndexOf(subString, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
+        }
+        /// <summary>
+        /// 高速的 IndexOf。
+        /// </summary>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static int IndexOfF(this string value, string subString, int startIndex, bool ignoreCase = false) {
+            return value.IndexOf(subString, startIndex, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
+        }
+
+        /// <summary>
+        /// 高速的 LastIndexOf。
+        /// </summary>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static int LastIndexOfF(this string value, string subString, bool ignoreCase = false) {
+            return value.LastIndexOf(subString, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
+        }
+        /// <summary>
+        /// 高速的 LastIndexOf。
+        /// </summary>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static int LastIndexOfF(this string value, string subString, int startIndex, bool ignoreCase = false) {
+            return value.LastIndexOf(subString, startIndex, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
+        }
+
+        /// <summary>
+        /// ToLowerInvariant 的简略写法。
+        /// </summary>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static string Lower(this string str) => str.ToLowerInvariant();
+        /// <summary>
+        /// ToUpperInvariant 的简略写法。
+        /// </summary>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static string Upper(this string str) => str.ToUpperInvariant();
+
+        #endregion
+
+        #region 分割与裁切
+
+        /// <summary>
+        /// 分割字符串。
+        /// 若原始字符串为空,则返回 {""}。
+        /// </summary>
+        public static string[] Split(this string fullStr, string splitStr) {
+            if (splitStr.IsSingle())
+                return fullStr.Split(splitStr[0]);
+            else
+                return fullStr.Split(new[] {splitStr}, StringSplitOptions.None);
+        }
+
+        /// <summary>
+        /// 获取在子字符串第一次出现之前的部分,例如对 2024/11/08 拆切 / 会得到 2024。
+        /// 如果未找到子字符串则不裁切。
+        /// </summary>
+        public static string BeforeFirst(this string str, string text, bool ignoreCase = false) {
+            int pos = string.IsNullOrEmpty(text) ? -1 : str.IndexOfF(text, ignoreCase);
+            if (pos >= 0)
+                return str.Substring(0, pos);
+            else
+                return str;
+        }
+        /// <summary>
+        /// 获取在子字符串最后一次出现之前的部分,例如对 2024/11/08 拆切 / 会得到 2024/11。
+        /// 如果未找到子字符串则不裁切。
+        /// </summary>
+        public static string BeforeLast(this string str, string text, bool ignoreCase = false) {
+            int pos = string.IsNullOrEmpty(text) ? -1 : str.LastIndexOfF(text, ignoreCase);
+            if (pos >= 0)
+                return str.Substring(0, pos);
+            else
+                return str;
+        }
+
+        /// <summary>
+        /// 获取在子字符串第一次出现之后的部分,例如对 2024/11/08 拆切 / 会得到 11/08。
+        /// 如果未找到子字符串则不裁切。
+        /// </summary>
+        public static string AfterFirst(this string str, string text, bool ignoreCase = false) {
+            int pos = string.IsNullOrEmpty(text) ? -1 : str.IndexOfF(text, ignoreCase);
+            if (pos >= 0)
+                return str.Substring(pos + text.Length);
+            else
+                return str;
+        }
+        /// <summary>
+        /// 获取在子字符串最后一次出现之后的部分,例如对 2024/11/08 拆切 / 会得到 08。
+        /// 如果未找到子字符串则不裁切。
+        /// </summary>
+        public static string AfterLast(this string str, string text, bool ignoreCase = false) {
+            int pos = string.IsNullOrEmpty(text) ? -1 : str.LastIndexOfF(text, ignoreCase);
+            if (pos >= 0)
+                return str.Substring(pos + text.Length);
+            else
+                return str;
+        }
+
+        /// <summary>
+        /// 获取处于两个子字符串之间的部分,裁切尽可能多的内容。
+        /// 等效于 AfterLast 后接 BeforeFirst。
+        /// 如果未找到子字符串则不裁切。
+        /// </summary>
+        public static string Between(this string str, string after, string before, bool ignoreCase = false) {
+            int startPos = string.IsNullOrEmpty(after) ? -1 : str.LastIndexOfF(after, ignoreCase);
+            if (startPos >= 0)
+                startPos += after.Length;
+            else
+                startPos = 0;
+
+            int endPos = string.IsNullOrEmpty(before) ? -1 : str.IndexOfF(before, startPos, ignoreCase);
+            if (endPos >= 0)
+                return str.Substring(startPos, endPos - startPos);
+            else if (startPos > 0)
+                return str.Substring(startPos);
+            else
+                return str;
+        }
+
+        #endregion
+
+        /// <summary>
+        /// 将第一个字符转换为大写,其余字符转换为小写。
+        /// </summary>
+        public static string Capitalize(this string word) {
+            if (string.IsNullOrEmpty(word)) return word;
+            return word.Substring(0, 1).Upper() + word.Substring(1).Lower();
+        }
+
+    }
+}