查找在当前文化中的所有字母之后排序的字符串的最佳方法
Best way to find string that sorts after all letters in the current culture
在 C# 中,我希望有一个在当前区域性中按字母顺序排序(不区分大小写)的名称列表,并有一个 "fake name" 自动排序在该列表的末尾。
如果排序使用的是 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);
如果我没记错,utf-16的最后一个字符是U+10FFFD
(U+10FFFE
和U+10FFFF
好像是保留的)
所以你可以这样做来得到一个我认为总是排在最后的字符串:
string fakeName= char.ConvertFromUtf32(0x10FFFD);
在 C# 中,我希望有一个在当前区域性中按字母顺序排序(不区分大小写)的名称列表,并有一个 "fake name" 自动排序在该列表的末尾。
如果排序使用的是 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);
如果我没记错,utf-16的最后一个字符是U+10FFFD
(U+10FFFE
和U+10FFFF
好像是保留的)
所以你可以这样做来得到一个我认为总是排在最后的字符串:
string fakeName= char.ConvertFromUtf32(0x10FFFD);