LINQ 和区分大小写

问题描述 投票:0回答:5

我有这个 LINQ 查询:

TempRecordList = new ArrayList(TempRecordList.Cast<string>().OrderBy(s => s.Substring(9, 30)).ToArray());

它工作得很好,并且以准确的方式执行排序,但与我想要的有点不同。在查询结果中我看到这样的内容:

Palm-Bouter,彼得
帕尔默-约翰逊,肖恩

而我真正需要的是按如下方式排序名称:

肖恩·帕尔默·约翰逊
彼得·帕姆-鲍特

基本上,我希望“-”字符被视为低于该字符,以便包含它的名称稍后显示在升序搜索中。

这是另一个例子。我得到:

迪亚斯、雷金纳德
迪布莱克利,安东

代替:

迪布莱克利,安东
迪亚斯、雷金纳德

正如您所看到的,由于大写字母“B”的处理方式,顺序也发生了切换。

所以我的问题是,我需要在 LINQ 查询中更改哪些内容才能使其按我指定的顺序返回结果。任何反馈将不胜感激。

顺便说一句,我尝试使用 s.Substring(9, 30).ToLower() 但这没有帮助。

谢谢!

linq sorting linq-to-objects case-sensitive
5个回答
6
投票

要自定义排序顺序,您需要创建一个实现

IComparer<string>
接口的比较器类。
OrderBy()
方法将比较器作为第二个参数。

internal sealed class NameComparer : IComparer<string> {
    private static readonly NameComparer DefaultInstance = new NameComparer();

    static NameComparer() { }
    private NameComparer() { }

    public static NameComparer Default {
        get { return DefaultInstance; }
    }

    public int Compare(string x, string y) {
        int length = Math.Min(x.Length, y.Length);
        for (int i = 0; i < length; ++i) {
            if (x[i] == y[i]) continue;
            if (x[i] == '-') return 1;
            if (y[i] == '-') return -1;
            return x[i].CompareTo(y[i]);
        }

        return x.Length - y.Length;
    }
}

这至少适用于以下测试用例:

var names = new[] {
    "Palmer-Johnson, Sean",
    "Palm-Bouter, Peter",
    "Dias, Reginald",
    "DiBlackley, Anton",
};

var sorted = names.OrderBy(name => name, NameComparer.Default).ToList();

// sorted:
// [0]: "DiBlackley, Anton"
// [1]: "Dias, Reginald"
// [2]: "Palmer-Johnson, Sean"
// [3]: "Palm-Bouter, Peter"

2
投票

正如已经提到的,

OrderBy()
方法将比较器作为第二个参数。

对于 strings,您不一定必须实现

IComparer<string>
。您可能对
System.StringComparer.CurrentCulture
(或
System.StringComparer
中的其他内容之一)感到满意。

但是,在您的具体情况下,没有内置比较器可以处理

letter
排序顺序之后的 -


0
投票

OrderBy()
按升序返回结果。

e
位于
h
之前,因此第一个结果(请记住,您正在比较以第9个位置的字符开头的子字符串......而不是字符串的开头)并且
i
位于
y之前
,因此是第二个。区分大小写与此无关。

如果您想要按降序排列结果,您应该使用

OrderByDescending()
:

TempRecordList.Cast<string>
              .OrderByDescending(s => s.Substring(9, 30)).ToArray());

0
投票

您可能只想实现一个自定义 IComparer 对象,该对象将为特殊、大写和小写字符赋予自定义优先级。

http://msdn.microsoft.com/en-us/library/system.collections.icomparer.aspx


0
投票

这适用于所有在二元期权和加密货币交易中损失惨重的人,大多数情况下,当您确定您的经纪人已经骗走了您大量现金时,您感到困惑和沮丧是正常的,但我可以向您保证我的情况也是如此。我很幸运遇到了电脑奇才Alex先生,他在不少于48小时内帮我拿回了80%的资金。我非常感激。我认为其他人可能需要他的帮助,这就是为什么我必须在这里留下这篇文章,以表达对他出色工作的感激之情。请随时通过 [电子邮件受保护] 与他联系 请提及您是我推荐的,以便他可以立即联系您,因为他一直小心冒名顶替者和间谍。

© www.soinside.com 2019 - 2024. All rights reserved.