我有以下linq表达式来做我的排序,但是想知道如何更改它以便它将按名称排序但忽略第一个单词,如果它是""
CaseStudies.OrderBy(a => a.Name)
答案 0 :(得分:7)
最简单的方法(如果总是有小写the
且单词之间不超过一个空格):
CaseStudies.OrderBy(a => a.Name.StartsWith("the ") ? a.Name.Substring(4) : a.Name)
您可以创建具有良好描述性名称的方法并移动此逻辑以及null检查并忽略大小写比较:
private string RemoveDefiniteArticle(string s)
{
if (String.IsNullOrEmpty(s))
return s;
if (s.StartsWith("the ", StringComparison.CurrentCultureIgnoreCase))
return s.Substring(4).TrimStart();
return s;
}
并使用它
CaseStudies.OrderBy(a => RemoveDefiniteArticle(a.Name))
答案 1 :(得分:2)
这里有一些令人惊讶的边缘案例。假设您的列表是
List<string> strings = new List<string> { "The aardvark", "the bear", "The cat", " dog", " elephant"};
然后起点是在开始处理“the”
strings.OrderBy(w => w.StartsWith("the ") ? w.Substring(4) : w);
给出了:
elephant
dog
the bear
The cat
The aardvark
忽略案例更好
strings.OrderBy(w => w.StartsWith("the ", StringComparison.CurrentCultureIgnoreCase) ? w.Substring(4) : w);
,并提供:
elephant
The cat
dog
The aardvark
the bear
在领先的“the”之后处理多个空格更好,但并不完美:
strings.OrderBy(w => w.StartsWith("the ", StringComparison.CurrentCultureIgnoreCase) ? w.Substring(4).TrimStart() : w);
elephant
dog
The aardvark
the bear
The cat
在前导“the”看起来正确之前处理前导空格
strings.OrderBy(w => w.TrimStart().StartsWith("the ", StringComparison.CurrentCultureIgnoreCase) ? w.TrimStart().Substring(4).TrimStart() : w.TrimStart());
给出:
The aardvark
the bear
The cat
dog
elephant
但是在多个点处可能存在其他边缘情况:null / empty / whitespace check ...
答案 2 :(得分:1)
CaseStudies.OrderBy(a => a.Name.TrimStart().StartsWith("the ", StringComparison.CurrentCultureIgnoreCase) ? a.Name.TrimStart().Substring(4).TrimStart() : a.Name)