按降序自然排序字符串列表 C#
Natural Sorting of list of string in descending order C#
我想问一下如何使用 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);
}
}
我可以按升序排序,但不能降序。
有什么想法吗?
你有两个选择:
- 可怕,永远不要这样做:使用升序然后简单地调用
Reverse()
方法(我只是将此选项列为警告因为,相信它不管是不是,我在生产代码中不止一次看到它。
- 好的方法:实现一个
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);
}
}
我想问一下如何使用 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);
}
}
我可以按升序排序,但不能降序。
有什么想法吗?
你有两个选择:
- 可怕,永远不要这样做:使用升序然后简单地调用
Reverse()
方法(我只是将此选项列为警告因为,相信它不管是不是,我在生产代码中不止一次看到它。 - 好的方法:实现一个
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);
}
}