2015-03-31 72 views
1

我使用System.Linq.Dynamic来订购一个物品清单。如何使用System.Dynamic.Linq对大小写不敏感?

items = items.AsQueryable().OrderBy("Name ASC"); 

令我惊讶的,小写的名字被资本套管名之后订购的,所以项目恢复这样的事情。

Ape 
Cat 
Dog 
alligator 
ant 
beetle 

我预计这个命令:

alligator 
ant 
Ape 
beetle 
Cat 
Dog 

有没有办法来得到正确的次序?检查OrderBy的所有方法签名并搜索,但是nada。

+0

更深入回答有关的IComparer/IComparable的[这里](http://stackoverflow.com/questions/24841170/linq-custom-sort)。 – user4735935 2015-03-31 22:34:25

回答

1

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

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); 
    } 
} 

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

+0

当我使用更通用的示例时,我可以使用它。问题是我在'MongoCollection '上使用'AsQueryable',然后''System.Linq.Dynamic.OrderBy'尝试对它进行排序。当我将'CaseInsensitiveComparer'作为第二个参数传递时,它不起作用。但这可能会成为另一个更具体的问题...... – 2015-03-31 22:47:25

+0

此解决方案对我无效。 – ismailarilik 2017-09-22 11:21:44

0

你并不需要创建一个自定义比较,因为已经有一个StringComparer类从IComparer派生。

words.OrderBy (x => x, StringComparer.OrdinalIgnoreCase) 

这样,你不需要,如果你想使用其他字符串比较方法,如StringComparer.InvariantCultureIgnoreCase创建不同IComparer实现。

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

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