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

时间:2018-12-04 10:50:45

标签: c# sorting c#-4.0 libraries

我想问一下如何使用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);
   }
}

我可以使其按升序进行排序,但不能按降序进行排序。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

让我们实现一个简单的 extension方法

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

答案 1 :(得分:0)

您有两个选择:

  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将不会排在适当的位置。