如何使用 System.Dynamic.Linq 对不区分大小写进行排序?

Adr*_*sca 7 c# linq

我使用 System.Linq.Dynamic 订购项目列表。

items = items.AsQueryable().OrderBy("Name ASC");
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,小写名称在大写名称之后排序,因此返回的项目是这样的。

Ape
Cat
Dog
alligator
ant
beetle
Run Code Online (Sandbox Code Playgroud)

我期望这个顺序:

alligator
ant
Ape
beetle
Cat
Dog
Run Code Online (Sandbox Code Playgroud)

有没有办法得到正确的顺序?检查了 OrderBy 的所有方法签名并用谷歌搜索,但 nada。

Mos*_*oss 10

您不需要创建自定义比较器,因为已经有一个StringComparer派生自IComparer.

words.OrderBy (x => x, StringComparer.OrdinalIgnoreCase)
Run Code Online (Sandbox Code Playgroud)

这样,IComparer如果您想使用其他字符串比较方法(如StringComparer.InvariantCultureIgnoreCase.

但是,根据您的情况,这可能是可取的。例如,我确实在 LINQPad 中定义了多个扩展方法,例如OrderBySelfInvariantCultureIgnoreCase,因为在代码完成中使用它而不是手动输入等效代码很方便:

public static IEnumerable<string> OrderBySelfInvariantCultureIgnoreCase(this IEnumerable<string> source)
{   
    return source.OrderBy (x => x, StringComparer.InvariantCultureIgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)


小智 2

您必须创建一个自定义比较器,例如:

public void Main() 
{   
    String[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry" }; 

    var sortedWords = words.OrderBy(a => a, new CaseInsensitiveComparer()); 

    ObjectDumper.Write(sortedWords); 
} 

public class CaseInsensitiveComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
        return string.Compare(x, y, StringComparison.OrdinalIgnoreCase); 
    } 
}
Run Code Online (Sandbox Code Playgroud)

找到@ https://code.msdn.microsoft.com/SQL-Ordering-Operators-050af19e