C# icomparer实现类如何决定数组项的排序顺序?
IComparer.Compare函数的返回值如何决定排序操作的顺序?返回值在决定排序顺序时的意义是什么?Array.Sort()的流是如何发生的 例如:C# icomparer实现类如何决定数组项的排序顺序?,c#,sorting,icomparable,icomparer,C#,Sorting,Icomparable,Icomparer,IComparer.Compare函数的返回值如何决定排序操作的顺序?返回值在决定排序顺序时的意义是什么?Array.Sort()的流是如何发生的 例如: int[] ii = new int[3] { 8,1,4}; Array.Sort(ii, new myComp1()); 有没有办法了解分拣操作的流程。我的意思是,如果我想确定排序的特定顺序,那么我应该如何编写if-else条件或返回值 class myComp1 : IComparer<int> {
int[] ii = new int[3] { 8,1,4};
Array.Sort(ii, new myComp1());
有没有办法了解分拣操作的流程。我的意思是,如果我想确定排序的特定顺序,那么我应该如何编写if-else条件或返回值
class myComp1 : IComparer<int>
{
public int Compare(int x, int y)
{
if (x == y)
return 1;
else if (x > y)
return -1;
else
return 0;
}
}
2类:IComparer
{
公共整数比较(整数x,整数y)
{
int res=0;
如果(x==y)
返回1;
如果(x>y),则为else
返回2;
其他的
返回3;
返回res;
}
}
Array.Sort
或任何其他.Sort
变体,以升序排列.NET排序项目
实现比较器时,结果的含义非常简单:
- 小于0:
小于x
y
- 大于0:
大于x
y
- 等于0:
等于x
y
- 比较操作必须是可传递的,例如1≤ 4.≤ 八,
IComparer
是一个很好的抽象,并且在其他场景中很有用,而不仅仅是排序
如果需要任何特定的项目顺序,可以定义保留传递性的比较器规则,也可以不使用.Sort
更新 作为程序员,您应该考虑:
公共整数比较(整数x,整数y)
{
//选择1
if(x
更新2 好的,假设我们有一个比较器,定义如下:
接口IComparer
{
排序位置比较(tx,tys);
}
其中,SortPlacement
的定义如下:
枚举排序位置
{
试着保持X和Y=0的顺序相同,
在升序=-1、//或任何负数之前放置
将\u X\u放在\u Y\u降序\u顺序=1、//或任何正数之后
}
当您实现比较器时,您非常清楚:
公共排序位置比较(int x,int y)
{
//选择1
if(x
现在,忘记愚蠢的枚举类型,用整数替换它-这是一个简单的约定。排序算法使用
比较
方法的返回值来确定排序时两个数字中的哪个应该在另一个之前
给定此签名:public int Compare(int x,int y)
返回值表示:
:returnValue<0
x
:returnValue==0
x==y
:returnValue>0
x>y
0
,则认为这些数字相等(并且它们的顺序不会改变)。如果返回-1
,则第一个数字应位于第二个数字之前。如果返回1
,则第一个数字应位于第二个数字之后
现在,由于您已经更改了Compare
方法中的定义,您将获得不同于通常预期的项目顺序,但这就是允许自定义比较器的全部意义——它让您决定“哪个先到”
但是,由于返回值实际上仅计算为0
、小于零
或大于零
,因此在第二个示例中,由于您始终返回大于零的值,因此顺序将未知(这将取决于所使用的算法)。我这样说是因为当我用{1,5,3}
测试它时,它颠倒了它们,但是当我使用{1,5,3,4,8}
时,顺序没有改变
请注意,由于comp2
中的所有事例都返回大于零的值,因此可以重写:
public int Compare(int x, int y) { return 1; }
此外,如果您想查看排序算法的使用情况,源代码是在线的,但您似乎更感兴趣的是什么您似乎想解释“less”的含义(“如果小于0,x小于y”)以及多个排序算法如何比较项(请注意,您可能已经检查了使用3种不同排序算法的情况—插入、堆和快速排序)。如果是这种情况,它会觉得这个问题有点太宽泛,所以…我很抱歉造成混淆。我知道排序算法。我的问题不是关于排序算法。主要是关于返回值。例如,myComp2不像myComp1那样返回-1,1或0,那么它甚至会对数组进行排序吗?返回v的重要性是什么这里的值?换言之:我如何知道myComp1当前正在上升或下降?一旦我知道,让我们说上升,我如何解释将x切换到y将使myComp1下降的结果?ThanksI还想补充一点,以使我的问题更清楚。如果myComp1不比较x和y,而是将x与某个常数进行比较呢nt值。在这种情况下,我可以计算一下调用Array.Sort()后应该得到什么结果吗。我也从MSDN获得了这一部分,但是当我们只说x和y时,我们怎么知道它是升序还是降序呢?我的意思是数组是8,1,4和
class myComp2 : IComparer<int>
{
public int Compare(int x, int y)
{
int res = 0;
if (x == y)
return 1;
else if (x > y)
return 2;
else
return 3;
return res;
}
}
public int Compare(int x, int y) { return 1; }