AngleSharp by Florian Rappl

<PackageReference Include="AngleSharp" Version="0.7.0" />

 StringExtensions

static class StringExtensions
Useful methods for string objects.
using AngleSharp.Css; using AngleSharp.DOM; using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Runtime.CompilerServices; using System.Text; namespace AngleSharp.Extensions { [DebuggerStepThrough] internal static class StringExtensions { public static bool Contains(this IEnumerable<char> list, char element) { foreach (char item in list) { if (item == element) return true; } return false; } public static T ToEnum<T>(this string value, T defaultValue) where T : struct, IComparable { if (string.IsNullOrEmpty(value)) return defaultValue; T result = default(T); if (Enum.TryParse(value, true, out result)) return result; return defaultValue; } public static double ToDouble(this string value, double defaultValue = 0) { if (string.IsNullOrEmpty(value)) return defaultValue; if (double.TryParse(value, out double result)) return result; return defaultValue; } public static int ToInteger(this string value, int defaultValue = 0) { if (string.IsNullOrEmpty(value)) return defaultValue; if (int.TryParse(value, out int result)) return result; return defaultValue; } public static uint ToInteger(this string value, uint defaultValue = 0) { if (string.IsNullOrEmpty(value)) return defaultValue; if (uint.TryParse(value, out uint result)) return result; return defaultValue; } public static bool ToBoolean(this string value, bool defaultValue = false) { if (string.IsNullOrEmpty(value)) return defaultValue; if (bool.TryParse(value, out bool result)) return result; return defaultValue; } public static string ReplaceFirst(this string text, string search, string replace) { int num = text.IndexOf(search); if (num < 0) return text; return text.Substring(0, num) + replace + text.Substring(num + search.Length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool Contains(this string str, string content) { return str.IndexOf(content) >= 0; } public static string CollapseAndStrip(this string str) { List<char> list = new List<char>(); bool flag = true; for (int i = 0; i < str.Length; i++) { if (str[i].IsSpaceCharacter()) { if (!flag) { list.Add(' '); flag = true; } } else { flag = false; list.Add(str[i]); } } if (flag && list.Count > 0) list.RemoveAt(list.Count - 1); return new string(list.ToArray()); } public static string Collapse(this string str) { List<char> list = new List<char>(); bool flag = false; for (int i = 0; i < str.Length; i++) { if (str[i].IsSpaceCharacter()) { if (!flag) { list.Add(' '); flag = true; } } else { flag = false; list.Add(str[i]); } } return new string(list.ToArray()); } public static bool Contains(this string[] list, string element, StringComparison comparison = StringComparison.Ordinal) { for (int i = 0; i < list.Length; i++) { if (list[i].Equals(element, comparison)) return true; } return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsOneOf(this string element, string item1, string item2) { if (!(element == item1)) return element == item2; return true; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsOneOf(this string element, string item1, string item2, string item3) { if (!(element == item1) && !(element == item2)) return element == item3; return true; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsOneOf(this string element, string item1, string item2, string item3, string item4) { if (!(element == item1) && !(element == item2) && !(element == item3)) return element == item4; return true; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsOneOf(this string element, string item1, string item2, string item3, string item4, string item5) { if (!(element == item1) && !(element == item2) && !(element == item3) && !(element == item4)) return element == item5; return true; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsOneOf(this string element, string item1, string item2, string item3, string item4, string item5, string item6) { if (!(element == item1) && !(element == item2) && !(element == item3) && !(element == item4) && !(element == item5)) return element == item6; return true; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsOneOf(this string element, string item1, string item2, string item3, string item4, string item5, string item6, string item7) { if (!(element == item1) && !(element == item2) && !(element == item3) && !(element == item4) && !(element == item5) && !(element == item6)) return element == item7; return true; } public static string StripLineBreaks(this string str) { char[] array = str.ToCharArray(); int num = 0; int num2 = array.Length; int num3 = 0; while (num3 < num2) { array[num3] = array[num3 + num]; if (array[num3].IsLineBreak()) { num++; num2--; } else num3++; } return new string(array, 0, num2); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string StripLeadingTailingSpaces(this string str) { return str.ToCharArray().StripLeadingTailingSpaces(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string StripLeadingTailingSpaces(this char[] array) { int i = 0; int num = array.Length - 1; for (; i < array.Length && array[i].IsSpaceCharacter(); i++) { } while (num > i && array[num].IsSpaceCharacter()) { num--; } return new string(array, i, 1 + num - i); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string[] SplitWithoutTrimming(this string str, char c) { return str.ToCharArray().SplitWithoutTrimming(c); } public static string[] SplitWithoutTrimming(this char[] chars, char c) { List<string> list = new List<string>(); int num = 0; for (int i = 0; i < chars.Length; i++) { if (chars[i] == c) { if (i > num) list.Add(new string(chars, num, i - num)); num = i + 1; } } if (chars.Length > num) list.Add(new string(chars, num, chars.Length - num)); return list.ToArray(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string[] SplitCommas(this string str) { return str.SplitWithTrimming(','); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string[] SplitHyphens(this string str) { return str.SplitWithTrimming('-'); } public static string[] SplitSpaces(this string str) { List<string> list = new List<string>(); List<char> list2 = new List<char>(); char[] array = str.ToCharArray(); for (int i = 0; i <= array.Length; i++) { if (i == array.Length || array[i].IsSpaceCharacter()) { if (list2.Count > 0) { string text = list2.ToArray().StripLeadingTailingSpaces(); if (text.Length != 0) list.Add(text); list2.Clear(); } } else list2.Add(array[i]); } return list.ToArray(); } public static string[] SplitWithTrimming(this string str, char c) { List<string> list = new List<string>(); List<char> list2 = new List<char>(); char[] array = str.ToCharArray(); for (int i = 0; i <= array.Length; i++) { if (i == array.Length || array[i] == c) { if (list2.Count > 0) { string text = list2.ToArray().StripLeadingTailingSpaces(); if (text.Length != 0) list.Add(text); list2.Clear(); } } else list2.Add(array[i]); } return list.ToArray(); } public static bool IsDigit(this string s) { for (int i = 0; i < s.Length; i++) { if (!s[i].IsDigit()) return false; } return true; } public static bool IsHex(this string s) { for (int i = 0; i < s.Length; i++) { if (!s[i].IsHex()) return false; } return true; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int FromHex(this string s) { return int.Parse(s, NumberStyles.HexNumber); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int FromDec(this string s) { return int.Parse(s, NumberStyles.Integer); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string HtmlEncode(this string value, Encoding encoding) { return value; } public static string CssString(this string value) { StringBuilder stringBuilder = Pool.NewStringBuilder(); stringBuilder.Append('"'); if (!string.IsNullOrEmpty(value)) { foreach (char c in value) { switch (c) { case '': throw new DomException(ErrorCode.InvalidCharacter); case '"': case '\\': stringBuilder.Append('\\').Append(c); break; default: if (c.IsInRange(1, 31) || c == '{') stringBuilder.Append('\\').Append(c.ToHex()).Append(' '); else stringBuilder.Append(c); break; } } } stringBuilder.Append('"'); return stringBuilder.ToPool(); } public static string CssUrl(this string value) { return FunctionNames.Url + "(" + value.CssString() + ")"; } public static string UrlEncode(this string value, Encoding encoding) { StringBuilder stringBuilder = Pool.NewStringBuilder(); byte[] bytes = encoding.GetBytes(value); byte[] array = bytes; for (int i = 0; i < array.Length; i++) { byte b = array[i]; char c = (char)b; switch (c) { case ' ': stringBuilder.Append('+'); break; default: if (!c.IsAlphanumericAscii()) { stringBuilder.Append('%').Append(b.ToString("X2")); break; } goto case '*'; case '*': case '-': case '.': stringBuilder.Append(c); break; } } return stringBuilder.ToPool(); } } }