2015-03-31 73 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); 
}