using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Chrosey.Extensions { public static class StringExtensions { /// /// Vergleicht 2 Strings Phonetisch und gibt wahr zurück, wenn sich der erste im zweiten befindet /// /// /// /// public static bool ComparePhonetic(this string lookFor, string source) { if (string.IsNullOrEmpty(lookFor)) { return true; } if (string.IsNullOrEmpty(source)) { return false; } var a = lookFor.KoelnPhonetic(); var b = source.KoelnPhonetic(); return b.IndexOf(a) >= 0; } /// /// Erstellt aus dem String die Kölner Phonetic Folge /// /// /// public static string KoelnPhonetic(this string input) { var trimmed = input.Trim(); var lower = trimmed.ToLower(); var replacedSpecialChars = lower .Replace('ä', 'a') .Replace('ö', 'o') .Replace('u', 'u') .Replace("ß", "ss") .Replace('é', 'e') .Replace('è', 'e') .Replace('à', 'a'); var withMarkers = "#" + replacedSpecialChars + "#"; var codeh = new[] { "h" }; var code0 = new[] { "a", "e", "i", "j", "o", "u", "y" }; var code1 = new[] { "b", "p" }; var code2 = new[] { "d", "t" }; var code3 = new[] { "f", "v", "w" }; var code4 = new[] { "g", "k", "q" }; var code5 = new[] { "l" }; var code6 = new[] { "m", "n" }; var code7 = new[] { "r" }; var code8 = new[] { "c", "s", "z" }; var code48 = new[] { "x" }; var code4combifirst = new[] { "a", "o", "u", "h", "k", "x", "q", "l", "r" }; var code4combi = new[] { "a", "o", "u", "h", "k", "x", "q" }; var code8combi = new[] { "c", "k", "q" }; var asNumber = string.Empty; for (int i = 1; i < withMarkers.Length - 1; i++) { var prev = withMarkers[i - 1].ToString(); var curr = withMarkers[i].ToString(); var next = withMarkers[i + 1].ToString(); string number; if (i == 1) { if (code0.Contains(curr)) number = "0"; else if (curr == "c" && code4combifirst.Contains(next)) number = "4"; else if (code2.Contains(curr) && code8.Contains(next)) number = "8"; else if (curr == "x") number = "48"; else if (codeh.Contains(curr)) number = "-"; else if (code1.Contains(curr)) number = "1"; else if (code2.Contains(curr)) number = "2"; else if (code3.Contains(curr)) number = "3"; else if (code4.Contains(curr)) number = "4"; else if (code5.Contains(curr)) number = "5"; else if (code6.Contains(curr)) number = "6"; else if (code7.Contains(curr)) number = "7"; else if (code8.Contains(curr)) number = "8"; else number = "?"; } else { if (code2.Contains(curr) && code8.Contains(next)) number = "8"; else if (code8combi.Contains(prev) && code48.Contains(curr)) number = "8"; else if (curr == "x") number = "48"; else if (prev == "s" && (curr == "c" || curr == "z")) number = "8"; else if (curr == "c" && code4combi.Contains(next)) number = "4"; else if (curr == "h") number = "-"; else if (code0.Contains(curr)) number = "0"; else if (code1.Contains(curr)) number = "1"; else if (code2.Contains(curr)) number = "2"; else if (code3.Contains(curr)) number = "3"; else if (code4.Contains(curr)) number = "4"; else if (code5.Contains(curr)) number = "5"; else if (code6.Contains(curr)) number = "6"; else if (code7.Contains(curr)) number = "7"; else if (code8.Contains(curr)) number = "8"; else number = "?"; } asNumber += number; } var withoutH = asNumber.Replace("-", ""); var zerosRemoved = withoutH[0] + withoutH.Substring(1).Replace("0", ""); var duplicatesRemoved = zerosRemoved[0].ToString(); for (int i = 1; i < zerosRemoved.Length; i++) { var curr = zerosRemoved[i].ToString(); var prev = zerosRemoved[i - 1].ToString(); if (curr != prev) { duplicatesRemoved += curr; } } return duplicatesRemoved; } /// /// Formatiert einen Eigenschaftsnamen mit Wert zum passenden Formatierten String /// /// der aktuelle String /// der Wert der Eigenschaft /// Das Format in dem die Rückgabe erfolgen soll /// Normales Format "(propertyName=value) public static string PropertyValueFormat(this string propertyName, object value, string format = "({0}={1})") { return string.Format(format, propertyName, value.ToString()); } public static string FirstUpper(this string me) { if (string.IsNullOrEmpty(me)) { return string.Empty; } return char.ToUpper(me[0]) + me.Substring(1); } public static string AsFormat(this string format, params object[] args) { return string.Format(format, args); } public static string ReplaceUmlaute(this string input) { return input.ToLower().Replace("ä", "ae").Replace("ü", "ue").Replace("ö", "oe").Replace("ß", "ss").Replace("é", "e"); } public static string PlaceUmlaute(this string input) { return input.Replace("ae", "ä").Replace("oe", "ö").Replace("ue", "ü").Replace("ss", "ß").Replace("aü", "aue").Replace("chäl", "chael").Replace("ßl", "ssl"); } public static string ShuffleTextSecure(this string source) { return new string(source.ShuffleSecure().ToArray()); } public static bool IsNumeric(this string value) { return int.TryParse(value, out int _); } public static bool IsDate(this string value) { return DateTime.TryParse(value, out DateTime _); } public static int LevenshteinDistance(this string a, string b) { int length1 = a.Length; int length2 = b.Length; if (length1 == 0) return length2; if (length2 == 0) return length1; int[,] numArray = new int[length1 + 1, length2 + 1]; int index1 = 0; while (index1 <= length1) numArray[index1, 0] = index1++; int index2 = 0; while (index2 <= length2) numArray[0, index2] = index2++; for (int index3 = 1; index3 <= length1; ++index3) { for (int index4 = 1; index4 <= length2; ++index4) { int num = (int)b[index4 - 1] == (int)a[index3 - 1] ? 0 : 1; numArray[index3, index4] = Math.Min(Math.Min(numArray[index3 - 1, index4] + 1, numArray[index3, index4 - 1] + 1), numArray[index3 - 1, index4 - 1] + num); } } return numArray[length1, length2]; } } }