Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用System.Dynamic.Linq区分大小写排序?_C#_Linq - Fatal编程技术网

C# 如何使用System.Dynamic.Linq区分大小写排序?

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除外。您必须创建自定义比较

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

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类似乎比公认的答案要好,后者定义了一个做同样事情的自定义比较器。