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();