У меня есть словарь <string, Point>
и ключи в этом словаре выглядеть следующим образом:C# макс() не возвращает естественное самое высокое значение
- char_1_1
- char_1_2
- ...
- char_1_9
- char_1_10
Теперь я использую следующий сек tatement получить heighest значения ключей:
pointsWhichBelongTogether.Keys.Where(key => key.Contains(searchStringPattern[0] + "_" + searchStringPattern[1] + "_")).OrderBy(x => x, new NaturalStringComparer()).Max()
который использует следующий Compare-Class:
public class NaturalStringComparer : IComparer<string>
{
private static readonly Regex _re = new Regex(@"(?<=\D)(?=\d)|(?<=\d)(?=\D)", RegexOptions.Compiled);
public int Compare(string x, string y)
{
x = x.ToLower();
y = y.ToLower();
if (string.Compare(x, 0, y, 0, Math.Min(x.Length, y.Length)) == 0)
{
if (x.Length == y.Length) return 0;
return x.Length < y.Length ? -1 : 1;
}
var a = _re.Split(x);
var b = _re.Split(y);
int i = 0;
while (true)
{
int r = PartCompare(a[i], b[i]);
if (r != 0) return r;
++i;
}
}
private static int PartCompare(string x, string y)
{
int a, b;
if (int.TryParse(x, out a) && int.TryParse(y, out b))
return a.CompareTo(b);
return x.CompareTo(y);
}
}
Так я полагаю, что этот список естественно сортируется и Max-функция просто получает самое высокую стоимость. Но max()
возвращает char_1_9
как самое высокое значение. Эта функция max() - повторная сортировка?
, так как вы sotring строки (а не числа), 'char_1_9' на самом деле считается больше, чем' char_1_10'. –
Заказ коллекции перед вызовом 'Max()' делает что именно? Вы просто вызываете 'IEnumerable .Max()'. –
CodeCaster
Но я сделал естественный Сортировка раньше? – Snickbrack