C# 如何使用System.Dynamic.Linq区分大小写排序?
我使用System.Linq.Dynamic来订购项目列表C# 如何使用System.Dynamic.Linq区分大小写排序?,c#,linq,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除外。您必须创建自定义比较
items = items.AsQueryable().OrderBy("Name ASC");
令我惊讶的是,小写名称在大写名称之后排序,所以返回的项目是这样的
Ape
Cat
Dog
alligator
ant
beetle
我期待这一订单:
alligator
ant
Ape
beetle
Cat
Dog
有没有办法得到正确的订单?检查了OrderBy的所有方法签名并在Google上搜索,但nada除外。您必须创建自定义比较器,例如:
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);
}
}
public void Main()
{
String[]words={“苹果”、“算盘”、“树枝”、“蓝莓”、“三叶草”、“樱桃”};
var sortedWords=words.OrderBy(a=>a,new caseinsensitiviecomparer());
ObjectDumper.Write(sortedWords);
}
公共类案件不敏感比较者:I比较者
{
公共整数比较(字符串x、字符串y)
{
返回string.Compare(x,y,StringComparison.OrdinalIgnoreCase);
}
}
发现@您不需要创建自定义比较器,因为已经有一个类派生自
IComparer
words.OrderBy (x => x, StringComparer.OrdinalIgnoreCase)
这样,如果您想使用其他字符串比较方法,如StringComparer.InvariantCultureIgnoreCase
,就不需要创建不同的IComparer
实现
然而,这可能是可取的,取决于您的情况。例如,我在LINQPad中定义了多个扩展方法,例如,OrderBySelfInvariantCultureInogoreCase
,因为在代码完成时使用它很方便,而不是手工键入等效代码:
public static IEnumerable<string> OrderBySelfInvariantCultureIgnoreCase(this IEnumerable<string> source)
{
return source.OrderBy (x => x, StringComparer.InvariantCultureIgnoreCase);
}
公共静态IEnumerable OrderBySelfInvariantCultureInoRecase(此IEnumerable源代码)
{
返回source.OrderBy(x=>x,StringComparer.InvariantCultureIgnoreCase);
}
我也面临同样的问题,在互联网上找不到简单的解决方案。然后我尝试了很多方法,最后得到了一个非常简单的方法。这对我完全有效。我的解决办法是
string sort = "Name ASC";
string[] data = sort.Split(" ");
items.OrderBy($"{data[0].ToUpper() data[1]}");
现在输出的是鳄鱼,
蚂蚁,
猿类
甲虫,
猫,
狗关于IComparer/IComparable的更深入的回答。当我使用你更一般的例子时,我让它起作用。问题是我在
MongoCollection
上使用AsQueryable
,然后使用System.Linq.Dynamic.OrderBy
对其进行排序。当我将您的caseinsensitiviecomparer
作为第二个参数传递时,它不起作用。但这可能是另一个更具体的问题……我使用了generic sorter,但当我将新的CaseInsensitiveComparer()传递给source.OrderBy(sortExpression)时,它给了我一个错误。@Shikha如果您提供您使用的特定代码,它会有所帮助,但不起作用。无意冒犯,但我并不完全相信人们所说的。根据您的话,我的直觉是您没有使用重载版本的OrderBy()
@BryanOfEarth这里是代码:public IQueryable Sort(IQueryable源,string sortBy,string sortDirection){var param=Expression.Parameter(typeof(T),CollectionName);var sortExpression=Expression.Lambda(Expression.Convert(Expression.Property(param,sortBy),typeof(object)),param);switch(sortDirection.ToLower()){case“asc”:返回源.OrderBy(sortExpression,);默认值:返回源.OrderByDescending(sortExpression);}使用已经实现的StringComparer类似乎比公认的答案要好,后者定义了一个做同样事情的自定义比较器。