C# 如何使分类列表反向排序?我必须定制一个IComparer吗?
在sortedlist队列中,queue.value[0]给出了最小键的对应值。如果我想让它给出max key的值,该怎么办 我必须重写icomparer吗?这里有一篇文章,它实现了一个C# 如何使分类列表反向排序?我必须定制一个IComparer吗?,c#,sortedlist,C#,Sortedlist,在sortedlist队列中,queue.value[0]给出了最小键的对应值。如果我想让它给出max key的值,该怎么办 我必须重写icomparer吗?这里有一篇文章,它实现了一个可逆列表。这允许更改排序方向 如果您总是希望反向排序行为而不需要按需更改,我会尝试使用构造函数。是的,您必须重写比较器 字符串作为键的示例:(刚刚与y.CompareTo(x)交换了x.CompareTo(y)) 私有类反相器比较程序:IComparer { 公共整数比较(字符串x、字符串y) { 返回y.Com
可逆列表。这允许更改排序方向
如果您总是希望反向排序行为而不需要按需更改,我会尝试使用构造函数。是的,您必须重写比较器
字符串作为键的示例:(刚刚与y.CompareTo(x)
交换了x.CompareTo(y)
)
私有类反相器比较程序:IComparer
{
公共整数比较(字符串x、字符串y)
{
返回y.CompareTo(x);
}
}
电话:
SortedList<string, Object> list = new SortedList<string, Object>(new InvertedComparer());
SortedList=新的SortedList(新的反相器比较程序());
在一些简单的情况下只需使用Array.Reverse()
using System;
class Program
{
static void Main()
{
// Input array.
int[] array = { 1, 2, 3 };
// Print.
foreach (int value in array)
{
Console.WriteLine(value);
}
Console.WriteLine();
// Reverse.
Array.Reverse(array);
// Print.
foreach (int value in array)
{
Console.WriteLine(value);
}
Console.WriteLine();
// Reverse again.
Array.Reverse(array);
// Print.
foreach (int value in array)
{
Console.WriteLine(value);
}
}
}
*输出*
1
2
3
3
2
1
1
2
3
您可以反转任何现有的iComparer。比如:
public static IComparer<T> Invert<T>(this IComparer<T> comparer)
{
return Comparer<T>.Create((x, y) => comparer.Compare(y, x));
}
公共静态IComparer反转(此IComparer比较器)
{
返回Comparer.Create((x,y)=>Comparer.Compare(y,x));
}
使用你的常规比较器。例如
new SortedList<,>(myShinyComparer.Invert());
newsortedList(myShinyComparer.Invert());
如果您只在最大密钥中查询,那么列表很大,性能是关键,您应该查看优先级队列()@larsm-我认为优先级队列是在C#中使用sortedlist/sortedDirectionary实现的。这不是真的吗?那将是一个糟糕的实现。优先级队列只要求第一个项目top是min/max元素,它对列表中的其余项目没有要求。通过利用这一点,优先级队列可能比完全排序的列表/字典更有效。通常,优先级队列是使用堆实现的(请参阅)
new SortedList<,>(myShinyComparer.Invert());