c# - 查找在当前区域性中所有字母之后排序的字符串的最佳方法

标签 c# sorting culture

在 C# 中,我希望有一个在当前区域性中按字母顺序排序(不区分大小写)的名称列表,并有一个自动在该列表末尾排序的“假名称”。

如果使用 ASCII 进行排序,我们可以使用“{”,因为它位于“z”之后,因此它总是在之后进行排序。但是,这对于基于文化的排序通常不起作用。

现在我正在使用“ZZZZZZZZZZZ”,它适用于英语,但我知道这不是正确的答案 - 有什么好的方法吗?

(我知道一种选择是在排序后将它们放在最后 - 不幸的是,在这种情况下这并不简单)

        var strings = new[] {"abc", "zzz", "ZZZ", "{"};

        var sortedStrings = strings.OrderBy(x => x, StringComparer.Create(new CultureInfo("en-GB"), ignoreCase: true));

        Console.WriteLine(string.Join(",", sortedStrings));
        // gives {,abc,zzz,ZZZ

最佳答案

您可以考虑将名称字符串包装在可以提供一些元数据的类型中,例如:

public class SortableName
{
    public string Name { get; set; }
    public bool IsFakeName { get; set; }
}

您可以扩展此类型并使用 LINQ 根据您的业务逻辑对集合进行排序,例如:

var names = new List<SortableName> { new SortableName { Name = "Test" }};
var sortedNames = names.OrderBy(n => n.IsFakeName)
                       .ThenBy(n => n.Name.ToLower()); //Case insensitivity

然后您可以将其投影到字符串集合中,并保留顺序:

var justNames = sortedNames.Select(n => n.Name);

关于c# - 查找在当前区域性中所有字母之后排序的字符串的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43679160/

相关文章:

java - .NET 的 XmlSerializer 的 Java 替代方案是什么

c# - 如何通过JQuery获取多行文本框的默认值?

c# - 从 nupkg 读取元数据

powershell - 完全更改当前 PowerShell session 的语言(包括文化)

c# - 将数字转换为特定于文化的

c# - 不支持文化。参数名称 : name US is an invalid culture identifier

c# - 将巨大的 Excel 工作表导入 Datatable

python - `sorted(list)` 与 `list.sort()` 之间有什么区别?

使用数据表对图像进行排序

bash - 如何对行组进行排序?