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

时间:2015-03-31 22:25:54

标签: c# linq

我使用System.Linq.Dynamic来订购商品列表。

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

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

Ape
Cat
Dog
alligator
ant
beetle

我期待这个订单:

alligator
ant
Ape
beetle
Cat
Dog

有没有办法获得正确的订单?检查了OrderBy的所有方法签名并用Google搜索,但是nada。

3 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我也遇到过同样的问题,并且在互联网上找不到简单的解决方案。然后我尝试了许多方法,最后得到了一个非常简单的方法。它完全对我有用。我的解决办法是

string sort = "Name ASC";
string[] data = sort.Split(" ");

items.OrderBy($"{data[0].ToUpper() data[1]}");

现在输出是鳄鱼皮, 蚂蚁, 猿, 甲虫, 猫, 狗