如何按照语言规则将第一个字母的标题列表分组?

时间:2017-08-20 21:12:08

标签: c# linq

我有一个我想要显示的游戏标题列表。使用OrderBy()根据当前文化的标题规则对列表进行排序,因此对于en-US,我会得到如下列表:

  • 其他游戏
  • B 以前的游戏
  • C arl的游戏
  • D 狂热的游戏
  • E arnest的游戏
  • E ven Better Game

这很棒,也正是我想要的。

但是,如何以文化敏感的方式将此列表和第一个字母(粗体字母)分组?更具体地说,如何获取OrderBy()用于对列表进行排序的实际字符串?

我尝试查看System.Globalization.SortKey.OriginalString,但它只返回了相同的字符串。

我知道我总是可以采取草率的方式,只是修剪" A"," An"和"""从字符串的开头,但我希望.Net有办法融入其文化敏感的排序逻辑,以获得更强大的解决方案。

编辑:看起来我错了,GroupBy()实际上并没有那样排序。我弄乱了我的样本清单。所以看起来我将不得不削减" A"," An"和"""前缀。感谢@stuartd指出我的错误。

1 个答案:

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

我们的想法是用空格分割标题,然后将它们连接起来而不用排除的单词。之后,这项工作就是一个简单的订单。

  • 简单track1
  • 简单 a track2

如果您只需要忽略所有排除项,直到第一个未排除的字词,您可以使用Skip来改进查询。

var result = titles.OrderBy(
    t => string.Join(" ", t.Split(' ')
        .SkipWhile(s => exclusions.Any(x => x.Equals(s, StringComparison.OrdinalIgnoreCase)))));
  • 简单的track2
  • 简单track1