internal static int TdbCompareStrings(IStringIterator s1, string s2, bool caseSensitive) { return TdbCompareStrings(s1, new StringStringIterator(s2), caseSensitive); }
// Strings mit IEnumerable<char> zu vergleichen ist nicht sinnvoll, weil dabei jedesmal ein CharComparer- // Objekt erzeugt wird. internal static int TdbCompareStrings(IStringIterator s1, IStringIterator s2, bool caseSensitive) { int result = 0; int len1 = s1.Length; int len2 = s2.Length; bool inUmlaut1 = false; bool inUmlaut2 = false; int p1 = int.MaxValue; int p2 = int.MaxValue; char c1 = (char)0; char c2 = (char)0; int i1 = 0, i2 = 0; while ((i1 < len1) && (i2 < len2)) { // Character von s1 behandeln c1 = s1[i1]; if (c1 == '^') c1 = ' '; if (c1 == 'ß') { c1 = 's'; if (inUmlaut1) inUmlaut1 = false; else { inUmlaut1 = true; --i1; } } else if (c1 >= 128 && c1 < 256) { c1 = umlautReplacementMap[(ushort)c1 & 0x7f]; if (p1 == int.MaxValue) p1 = i1; } if (!caseSensitive && c1 < 256) c1 = (char)upperMap[(byte)c1]; // // Character von s2 behandeln c2 = s2[i2]; if (c2 == '^') c2 = ' '; if (c2 == 'ß') { c2 = 's'; if (inUmlaut2) inUmlaut2 = false; else { inUmlaut2 = true; --i2; } } else if (c2 >= 128 && c2 < 256) { c2 = umlautReplacementMap[(ushort)c2 & 0x7f]; if (p2 == int.MaxValue) p2 = i2; } if (!caseSensitive && c2 < 256) c2 = (char)upperMap[(byte)c2]; // if (p1 == p2) { p1 = int.MaxValue; p2 = int.MaxValue; } if (c1 != c2) break; // ++i1; ++i2; } if (i1 < len1 && i2 < len2) { if (c1 < c2) result = -1; else if (c1 > c2) result = +1; else if (p1 < p2) result = +1; else if (p1 > p2) result = -1; else result = 0; } else if (i1 < len1) { // Der linke ist länger result = +1; } else if (i2 < len2) { // Der rechte ist länger result = -1; } else if (p1 < p2) result = +1; else if (p1 > p2) result = -1; else result = 0; return result; }
internal static int TdbCompareStrings(string s1, IStringIterator s2, bool caseSensitive) { return TdbCompareStrings(new StringStringIterator(s1), s2, caseSensitive); }