我使用System.Linq.Dynamic来订购商品列表。
items = items.AsQueryable().OrderBy("Name ASC");
令我惊讶的是,小写名称在大写字母名称之后被排序,因此返回的项目就是这样。
Ape
Cat
Dog
alligator
ant
beetle
我期待这个订单:
alligator
ant
Ape
beetle
Cat
Dog
有没有办法获得正确的订单?检查了OrderBy的所有方法签名并用Google搜索,但是nada。
答案 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]}");
现在输出是鳄鱼皮, 蚂蚁, 猿, 甲虫, 猫, 狗