У меня есть странная проблема, и у меня нет подсказки, чтобы отслеживать причину. Я попытаюсь четко описать свою проблему.IComparer issue
Я класс RTree, в этом классе, я хочу, чтобы сравнить два rectanlge (здесь я назвал конверт, он содержит Minx, MinY, Maxx, MAXY), поэтому у нас есть класс компаратора следующим образом:
private class AnonymousXComparerImpl : IComparer
{
public AnonymousXComparerImpl()
{ }
public int Compare(object o1, object o2)
{
IEnvelope ea = (IEnvelope)((IBoundable)o1).Bounds;
IEnvelope eb = (IEnvelope)((IBoundable)o2).Bounds;
double a = (ea.MinX + ea.MaxX)/2d;
double b = (eb.MinX + eb.MaxX)/2d;
return a > b ? 1 : a < b ? -1 : 0;
}
}
С помощью этого компаратора мы можем поддерживать ArrayList конверта и сортировать его легко, конверты беспорядочно добавляются. Когда мы называем следующий код, и мы встретились с
Невозможно разобраться, так как метод IComparer.Compare() возвращает противоречивые результаты. Либо значение не сравнивается с самим собой, , либо одно значение, несколько по сравнению с другим значением, дает разные результаты .
sortedChildBoundables.Sort(new AnonymousXComparerImpl());
Вот странная часть. Эта ошибка возникает только в .net 4.0, которая не устанавливает VistualStudio. Если на машине установлены VS или .net 4.5, эта проблема не может повториться повторно.
В этом случае я не могу понять, почему это происходит. Будет здорово, если у вас есть какой-либо опыт по отладке такого рода вопросов, я ценю.
Спасибо, Говард
Единственное, что я могу придумать здесь, это проблемы с плавающей запятой, означающие, что равенство не совсем подходит для одних и тех же предметов, не знаю, почему это было бы специфично для v4. Вы пытались обеспечить уровень округления? –
Попробуйте использовать тип данных 'decimal' вместо двойного – Saravanan
Там нет других потоков? Кроме того, эта тема может представлять интерес: http://stackoverflow.com/questions/6683059/are-floating-point-numbers-consistent-in-c-can-they-be –