LINQ 和 CASE 敏感性

标签 linq sorting linq-to-objects case-sensitive

我有这个 LINQ 查询:

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

它运行良好,排序方式准确但与我想要的略有不同。在查询结果中,我看到类似这样的内容:

帕姆-布特,彼得
肖恩·帕默-约翰逊

而我真正需要的是像这样对名称进行排序:

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

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

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

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

代替:

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

如您所见,由于大写字母“B”的处理方式,顺序再次发生了变化。

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

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

谢谢!

最佳答案

要自定义排序顺序,您需要创建一个实现 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"

关于LINQ 和 CASE 敏感性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5328737/

相关文章:

LINQ:子查询中第一行的内连接?

c# - 如何使用 linq to object 从过滤 2 个列表创建列表

mysql - NHibernate.ISession.Linq<T>.Where(expression) 检索整个表

c# - 使用 linq to txt 解析行

c# - 字典的 OrderBy 方法的大 O 是什么

ios - 你如何在 swift 中从 JSON 中排序 NSMutableArray?

sql - LINQ 订单。它总是返回相同的有序列表吗?

c# - Lambda 表达式不正确

c# - 如果选择的值为空,如何让我的 Linq 选择返回值?

java - 对字符串数组和 int 数组进行排序