Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# icomparer实现类如何决定数组项的排序顺序?_C#_Sorting_Icomparable_Icomparer - Fatal编程技术网

C# icomparer实现类如何决定数组项的排序顺序?

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> {

IComparer.Compare函数的返回值如何决定排序操作的顺序?返回值在决定排序顺序时的意义是什么?Array.Sort()的流是如何发生的

例如:

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