Естественная сортировка списка строк по убыванию C # - PullRequest
0 голосов
/ 04 декабря 2018

Я хотел бы спросить, как отсортировать List<string> в порядке убывания, используя библиотеку Natural Sort Comparer .

Я хотел бы спросить, пользуетесь ли вы кем-то этой библиотекой https://www.codeproject.com/Articles/22517/Natural-Sort-Comparer для сортировки List<string>?

Это фрагменты кода для возрастания

public List<string> contents = new List<string>{ "a,b,c,d,e,f" };
public void sorting()
{
   using (NaturalSortComparer comparer = new NaturalSortComparer())
   {
      contents.Sort(comparer);
   }
}

Я могу заставить его работать для сортировки по возрастанию , но не по убыванию .

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Давайте реализуем простой метод расширения :

  public static partial class ComparerExtensions {
    public static IComparer<T> Reverse<T>(this IComparer<T> comparer) {
      if (null == comparer)
        throw new ArgumentNullException(nameof(comparer));

      return Comparer<T>.Create((left, right) => comparer.Compare(right, left));
    }
  }

Затем вы можете отменить любой компаратор (ICompare<T>), который вам нравится:

 MyList.Sort(YourCustomComparer.Reverse());

В вашем случае (немного странная реализация с использованием компаратора IDisposable):

 using (var naturalComparer = new NaturalComparer()) {
   contents.Sort(naturalComparer.Reverse()); 
 }

Редактировать: В случае C # 4.0 или ранееверсия (которая не имеет Comparer<T>.Create), мы можем реализовать метод расширения следующим образом:

  public static partial class ComparerExtensions {
    private sealed class ReversedComparer<T> : IComparer<T> {
      private readonly IComparer<T> m_Comparer;

      public ReversedComparer(IComparer<T> comparer) {
        m_Comparer = comparer;
      }

      public int Compare(T x, T y) {
        return m_Comparer.Compare(y, x);
      }
    }

    public static IComparer<T> Reverse<T>(this IComparer<T> comparer) {
      if (null == comparer)
        throw new ArgumentNullException(nameof(comparer));

      return new ReversedComparer<T>(comparer);
    }
  }
0 голосов
/ 04 декабря 2018

У вас есть два варианта:

  1. Ужасно, никогда не делайте этого : используйте восходящий порядок, а затем просто вызовите метод Reverse() (я перечисляю этот параметр только какпредупреждение, потому что, хотите верьте, хотите нет, я не раз видел это в рабочем коде).
  2. Хороший способ: реализовать IComparer<string>, который просто возвращает отрицание "восходящего" компаратора (илипереключает порядок аргументов) и передает его в ваш метод сортировки.

Но nº2 уже встроен в фреймворк;это метод расширения OrderByDescending:

var ss = new[] {"a1", "a03", ... }
var descending = ss.OrderByDescending(
    s => s,
    new NaturalComparer());

ОБНОВЛЕНИЕ: Ваш обновленный вопрос подразумевает, что вы хотите использовать List.Sort.В этом случае путь # 2, OrderBy не будет сортироваться на месте.

...