我有一个我想要显示的游戏标题列表。使用OrderBy()
根据当前文化的标题规则对列表进行排序,因此对于en-US,我会得到如下列表:
这很棒,也正是我想要的。
但是,如何以文化敏感的方式将此列表和第一个字母(粗体字母)分组?更具体地说,如何获取OrderBy()
用于对列表进行排序的实际字符串?
我尝试查看System.Globalization.SortKey.OriginalString
,但它只返回了相同的字符串。
我知道我总是可以采取草率的方式,只是修剪" A"," An"和"""从字符串的开头,但我希望.Net有办法融入其文化敏感的排序逻辑,以获得更强大的解决方案。
编辑:看起来我错了,GroupBy()
实际上并没有那样排序。我弄乱了我的样本清单。所以看起来我将不得不削减" A"," An"和"""前缀。感谢@stuartd指出我的错误。
答案 0 :(得分:2)
我不知道任何已经实施的解决方案来按需要对标题进行排序。由于您可以排除的字数不是很多(我相信),您可以定义自己的排除列表,如
List<string> exclusions = new List<string>()
{
"the", "an", "a",
};
根据此排除项,您可以使用忽略您定义的exlus的简单查询来命令您的标题(在此实现中不区分大小写):
var orderedTitles = titles.OrderBy(
t => string.Join(" ", t.Split(' ')
.Where(s => !exclusions.Any(x => x.Equals(s, StringComparison.OrdinalIgnoreCase)))));
我们的想法是用空格分割标题,然后将它们连接起来而不用排除的单词。之后,这项工作就是一个简单的订单。
如果您只需要忽略所有排除项,直到第一个未排除的字词,您可以使用Skip
来改进查询。
var result = titles.OrderBy(
t => string.Join(" ", t.Split(' ')
.SkipWhile(s => exclusions.Any(x => x.Equals(s, StringComparison.OrdinalIgnoreCase)))));