我遇到了一个非常奇怪的.NET框架行为,即在对集合进行排序时。
这种行为在.NET 3.5和4.0之间有所不同(但我认为我知道原因),但更重要的是(这是我的真正关注点),不同机器上相同框架的行为也不同。
背景
我正在开发一款软件,该软件依赖于第三方软件(spring.net),在某些情况下,它会对一个所有项都“相等”的集合进行排序(比较器始终返回0)。这不在我的控制范围内,如果该列表的排序行为始终保持一致,我将非常满意。但事实并非如此。
如何复现
创建一个简单的项目,在.NET 3.5中运行下面的代码。 当编译为3.5时,行为似乎是一致的,集合将被“反转”(结果为Three, Two, One)。 现在,请将项目目标更改为.NET 4 (不是4.5),然后再次运行: 在我的机器上,它不再反转集合(One, Two, Three),但在其他同事的机器上,它确实反转了(Three, Two, One)!!!我们的设置完全一样...
请告诉我,在您的机器上,在4.0下是哪一个?反转还是不反转?
我正在尝试评估我的设置是否正确。
概念证明
class Program
{
static void Main()
{
var collection = new ArrayList
{
"One",
"Two",
"Three",
};
// It should in any case write One, Two, Three
Console.Out.WriteLine("Before sort: ");
foreach (string item in collection)
{
Console.Out.WriteLine("\t"+item);
}
collection.Sort(new OrderComparator());
// In .NET 3.5, it will write Three, Two, One
// In .NET 4, it will sometimes write Three, Two, One, sometimes One, Two, Three: what is it for you?
Console.Out.WriteLine("After sort: ");
foreach (string item in collection)
{
Console.Out.WriteLine("\t" + item);
}
Console.Out.WriteLine("--end--");
Console.Read();
}
}
public class OrderComparator : IComparer
{
public virtual int Compare(object o1, object o2)
{
return 0;
}
}
另外,如果您知道为什么会出现这种情况,请告诉我!