在实现IComparable时,为什么相同的项目不能以相同的顺序放置

bgu*_*ura 3 .net c#

我发现当我为我的一个类实现CompareTo(..)时,机器之间的排序是不一致的.当两个对象相等时,它们并不总是以相同的顺序排序.我假设一些单线程迭代方法将用于排序,所以我会假设一致的排序.

鉴于以下课程..

class Property : ICompareable<Property> 
{
    public int Value;
    public int Name;

    public int CompareTo(Property other)
    {
        if(this.Value > other.Value)
            return 1;
        if(this.Value < other.Value)
            return -1;
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

并给出以下对象

{ 
   List.add(new Property( name="apple", value = 1) );
   List.add(new Property( name="grape", value = 2) );
   List.add(new Property( name="banana", value = 1) );
}
Run Code Online (Sandbox Code Playgroud)

当我执行

List.sort();
Run Code Online (Sandbox Code Playgroud)

然后当使用索引单步执行列表时,banana和apple的顺序会根据我正在执行代码的PC而改变.为什么是这样?

Ser*_*rvy 7

List.Sort根据MSDN,不提供稳定的排序:

此实现执行不稳定的排序; 也就是说,如果两个元素相等,则可能不会保留它们的顺序.相反,稳定的排序保留了相等元素的顺序.

如果你需要一个稳定的排序考虑使用OrderByLINQ,这一个稳定的排序.