2015-09-15 3 views
1

Недавно я столкнулся с очень странной проблемой. Я развернула новую версию программы, и я получаю эту ошибку, когда метод IComparer.Compare() вызывается внутренне:Ошибка сортировки .NET IComparer

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 (debug или release версии), и это не происходит, когда я устанавливаю приложение. Чтобы сделать вещи более странными, это даже не происходит на каждом компьютере в производстве, только около 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; } 
    } 
} 

Кто-нибудь еще был этот вопрос и нашел решение этого? Является ли мой сравнитель похожим на все случаи? Я полностью потерял эту проблему и понятия не имею, что попробовать дальше. Любая помощь будет оценена.

+0

можете ли вы установить трассировку, чтобы узнать, что такое значения? это не так? –

+0

Вероятно, dup: http://stackoverflow.com/questions/13407412/where-is-the-inconsistency-in-this-icomparer-that-is-causing-a-null-reference –

+0

Это напрямую не помогает вашему вопросу , но посмотрите ['String.StartsWith (String, StringComparison)'] (https://msdn.microsoft.com/en-us/library/ms131452 (v = vs.110) .aspx). Тогда вам не нужно проверять, скажем, как 'l', так и' L'. –

ответ

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

Как примечание стороны, то, как вы написали эту функцию Comparer весьма ineffecient.

+0

Спасибо! Я закончил тем, что понял это сам, и так случилось, что именно так я его исправил. – kformeck

Смежные вопросы