.NET IComparer 排序错误

.NET IComparer sort error

我最近 运行 遇到了一个非常奇怪的问题。我部署了程序的新版本,但在内部调用 IComparer.Compare() 方法时收到此错误:

Unable to sort because the IComparer.Compare0 method returns inconsistent
results. Either a value does not compare equal to itself, or one value     repeatedly
compared to another value yields different results. x:",x's type: 'String',
IComparer.".

奇怪的是我无法在我的电脑上重现这个问题。在 Visual Studio 2013(调试或发布版本)中它不会发生在我身上,并且在我安装应用程序时也不会发生。更奇怪的是,它甚至不会发生在生产中的每台计算机上,只有大约 30%。

我的应用程序以 .NET Framework 4 为目标,平台目标是 x86。

我的代码中只有一个 IComparer 对象实例,这里是:

public int Compare(string stringOne, string stringTwo)
{
    if (stringOne == stringTwo) { return 0; }
    else if (stringOne == null) { return stringTwo == null ? 0 : -1; }
    else if (stringTwo == null) { return stringOne == null ? 0 : 1; }

    else if (stringOne.StartsWith("_") && !stringTwo.StartsWith("_"))
    {
        return -1;
    }
    else if (!stringOne.StartsWith("_") && stringTwo.StartsWith("_"))
    {
        return 1;
    }
    else if ((stringOne.StartsWith("l") || stringOne.StartsWith("L")) &&
            (!stringTwo.StartsWith("l") || !stringTwo.StartsWith("L")))
    {
        return -1;
    }
    else if ((!stringOne.StartsWith("l") || !stringOne.StartsWith("L")) &&
              (stringTwo.StartsWith("l") || stringTwo.StartsWith("L")))
    {
        return 1;
    }
    else
    {
        if (stringTwo == null) { return 1; }
        else { return stringOne.CompareTo(stringTwo) == 1 ? -1 : 1; }
    }
}

有没有其他人遇到过这个问题并找到了解决方案?我的比较器看起来是否涵盖所有情况?我完全迷失了这个问题,不知道下一步该尝试什么。任何帮助将不胜感激。

这个

else if ((stringOne.StartsWith("l") || stringOne.StartsWith("L")) &&
            (!stringTwo.StartsWith("l") || !stringTwo.StartsWith("L")))
    {
        return -1;
    }
    else if ((!stringOne.StartsWith("l") || !stringOne.StartsWith("L")) &&
              (stringTwo.StartsWith("l") || stringTwo.StartsWith("L")))
    {
        return 1;
    }

应该是

else if ((stringOne.StartsWith("l") || stringOne.StartsWith("L")) &&
            !(stringTwo.StartsWith("l") || stringTwo.StartsWith("L")))
    {
        return -1;
    }
    else if (!(stringOne.StartsWith("l") || stringOne.StartsWith("L")) &&
              (stringTwo.StartsWith("l") || stringTwo.StartsWith("L")))
    {
        return 1;
    }

附带说明一下,您编写此比较器函数的方式非常低效。