2015-03-31 2 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 и googled вокруг, но nada.

+0

более глубокий ответ относительно IComparer/IComparable [здесь] (http://stackoverflow.com/questions/24841170/linq-custom-sort). – user4735935

ответ

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

Когда я использую ваш более общий пример, я заставляю его работать. Дело в том, что я использую 'AsQueryable' на' MongoCollection ', а затем 'System.Linq.Dynamic.OrderBy', чтобы попытаться отсортировать его. Когда я передаю ваш «CaseInsensitiveComparer» в качестве второго параметра, он не работает. Но это, возможно, может рассматриваться как еще один конкретный вопрос ... –

+0

Это решение не сработало для меня. – ismailarilik

0

Вам не нужно создавать собственный компаратор, потому что уже есть 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); 
} 
Смежные вопросы