在List <T> .Sort()方法中,是一个与自身相比的项目吗?

For*_*ter 7 c# sorting quicksort icomparer

如果我将自定义IComparer传递给List的Sort()方法的实例,是否会使用相同的项调用比较器的Compare(x,y)方法?

即.是否有Compare(x,x)可能被召唤.

编辑:对列表中的项目不同的情况更感兴趣.

Joh*_*hnD 11

我写了一个测试程序来试试.它看起来确实比较()相同的元素与自身(至少相同的项目两次调用Compare()两次).在这个程序中,使用参数(2,2)调用Compare().

using System;
using System.Collections.Generic;

static class Program
{
    class MyComparer : Comparer<int>
    {
        public override int Compare(int x, int y)
        {
            Console.WriteLine("Compare(" + x + ", " + y + ")");
            if (x < y) return -1;
            if (x > y) return 1;
            return 0;
        }
    }

    static void Main()
    {
        MyComparer comparer = new MyComparer();
        List<int> list = new List<int> { 1, 2, 3 };
        list.Sort(comparer);
        return;

    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Compare(1, 2)
Compare(1, 3)
Compare(2, 3)
Compare(1, 2)
Compare(2, 2)
Compare(2, 3)
Compare(2, 2)
Run Code Online (Sandbox Code Playgroud)

  • .NET 4.6.2 不再发生这种情况(与上面的 C# 代码相同)。现在它只写: `Compare(1, 2) Compare(1, 3) Compare(2, 3)` 高效。 (2认同)

Tho*_*mas 8

来自文档:

此方法使用Array.Sort,它使用QuickSort算法.

QuickSort永远不会将项目与自身进行比较.QuickSort的一些实现将项目与自身进行比较.如果该项目在列表中出现多次,也会发生这种情况.

无论哪种方式,为了使您的比较函数成为正确的,良好的比较函数,您需要处理与自身进行比较的元素的情况.