【问题标题】:Best way to find string that sorts after all letters in the current culture查找在当前文化中的所有字母之后排序的字符串的最佳方法
【发布时间】:2017-04-28 11:29:50
【问题描述】:

在 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

【问题讨论】:

  • 你能举一个使用{不起作用的例子吗?
  • 你能给我们一些输入和输出的例子吗?
  • 已编辑以举例说明 { 位于列表的前面。

标签: c# sorting culture


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果我没记错的话,utf-16 中的最后一个字符是U+10FFFDU+10FFFEU+10FFFF 似乎是保留的) 所以你可以这样做来得到一个我认为永远是最后一个的字符串:

    string fakeName= char.ConvertFromUtf32(0x10FFFD);
    

    【讨论】:

    • 假设你的意思是 U+10FFFE 和 U+10FFFF 是保留的 - 有趣,会尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2015-06-20
    • 2020-09-08
    • 2017-10-06
    相关资源
    最近更新 更多