C#max()未返回自然最高值
我有一本C#max()未返回自然最高值,c#,C#,我有一本字典,字典中的键如下所示: char_1_1 char_1_2 char_1_9 char_1_10 现在,我使用以下语句来接收键的最大值: pointsWhichBelongTogether.Keys.Where(key => key.Contains(searchStringPattern[0] + "_" + searchStringPattern[1] + "_")).OrderBy(x => x, new NaturalStringComparer()).Ma
字典,字典中的键如下所示:
- char_1_1
- char_1_2
- char_1_9
- char_1_10
pointsWhichBelongTogether.Keys.Where(key => key.Contains(searchStringPattern[0] + "_" + searchStringPattern[1] + "_")).OrderBy(x => x, new NaturalStringComparer()).Max()
它使用以下比较类:
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);
}
}
公共类NaturalStringComparer:IComparer
{
private static readonly Regex\u re=new Regex(@)(?您有两个选项:
- 从已排序的列表中选取最后一个
,或
Max
不使用比较器,而是使用默认比较器来查找最大值
pointsWhichBelongTogether.Keys.Where(key => key.Contains(searchStringPattern[0] + "_" + searchStringPattern[1] + "_"))
.OrderBy(x => x, new NaturalStringComparer()).Last();
或
编辑:在以前的版本中,我建议将比较器传递给
Max
,但似乎没有重载占用比较器,只有选择器。字符串类型已经实现了IComparable
所以Max()
使用此实现,而不考虑以前的排序。我将按降序排列您的值,并取第一个值:
var max = pointsWhichBelongTogether.Keys
.Where(key => key.Contains(searchStringPattern[0] + "_" + searchStringPattern[1] + "_"))
.OrderByDescending(x => x, new NaturalStringComparer())
.FirstOrDefault();
由于您正在排序字符串(而不是数字),
char\u 1\u 9
实际上被认为比char\u 1\u 10
大。在调用Max()
之前排序集合的作用是什么?您只需调用IEnumerable.Max()
。但我以前做过自然排序?如果只需要获得最大值,不需要对所有元素排序。遍历所有元素并记住当前的最大值,效率会更高。@Snickbrack这是一个复制粘贴错误,我仍然在寻找一个Max
重载,它需要一个比较器并忘记删除那条未完成的线。
var max = pointsWhichBelongTogether.Keys
.Where(key => key.Contains(searchStringPattern[0] + "_" + searchStringPattern[1] + "_"))
.OrderByDescending(x => x, new NaturalStringComparer())
.FirstOrDefault();