按降序自然排序字符串列表 C#

Natural Sorting of list of string in descending order C#

我想问一下如何使用 Natural Sort Comparer 库对 List<string> 进行降序排序。

想问问大家有没有用过这个库 https://www.codeproject.com/Articles/22517/Natural-Sort-ComparerList<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);
   }
}

我可以按升序排序,但不能降序

有什么想法吗?

你有两个选择:

  1. 可怕,永远不要这样做:使用升序然后简单地调用 Reverse() 方法(我只是将此选项列为警告因为,相信它不管是不是,我在生产代码中不止一次看到它。
  2. 好的方法:实现一个 IComparer<string> 简单地 returns 比较器 "ascending" 的负数(或切换参数顺序)并将其传递到您的排序方法中。

但是nº2已经内置在你的框架中;它的扩展方法 OrderByDescending:

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

更新:您更新的问题似乎暗示您想使用 List.Sort。在那种情况下,要走的路是#2,OrderBy 不会就地排序。

让我们实现一个简单的扩展方法:

  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);
    }
  }