Linq OrderBy但忽略第一个字如果“the”

时间:2014-02-17 09:22:53

标签: linq c#-4.0

我有以下linq表达式来做我的排序,但是想知道如何更改它以便它将按名称排序但忽略第一个单词,如果它是""

CaseStudies.OrderBy(a => a.Name)

3 个答案:

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