我想问一下如何使用Natural Sort Comparer库对List<string>
进行降序排序。
我想问一下您是否有人使用过该库
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);
}
}
我可以使其按升序进行排序,但不能按降序进行排序。
有什么想法吗?
答案 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)
您有两个选择:
Reverse()
方法(我只是将此选项列为警告,因为无论您是否相信,我在生产代码中已经多次看到它了。IComparer<string>
,它只返回“升序”比较器的负数(或切换参数顺序)并将其传递到排序方法中。但是nº2已经在您的框架中建立了;其扩展方法OrderByDescending
:
var ss = new[] {"a1", "a03", ... }
var descending = ss.OrderByDescending(
s => s,
new NaturalComparer());
更新:您更新的问题似乎暗示您要使用List.Sort
。在这种情况下,处理方法是#2,OrderBy
将不会排在适当的位置。