Mam dziwny problem i nie mam pojęcia, jak go rozpoznać. Postaram się wyraźnie opisać mój problem.Wydanie IComparer
Mam klasy R-drzewo, w tej klasie, chcę porównać dwa rectanlge (tutaj Zadzwoniłem koperta, zawiera Minx, miny, Maxx, maxy), więc mamy klasę comparer następująco:
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;
}
}
Dzięki temu narzędziu możemy zachować ArrayList of envelope i łatwo sortować, koperty są losowo dodawane. Kiedy wzywamy poniższy kod i spotkaliśmy
Nie można sortować ponieważ metoda IComparer.Compare() zwraca wyniki niespójne. Wartość nie równa się sama sobie, lub jedna wartość wielokrotnie w porównaniu do innej wartości daje różne wyniki .
sortedChildBoundables.Sort(new AnonymousXComparerImpl());
Oto dziwne część. Ten błąd występuje tylko w .net 4.0, który nie instaluje VistualStudio. Jeśli na maszynie zainstalowano VS lub .net 4.5, problemu nie można powtórzyć ponownie.
W tym przypadku nie wiem, dlaczego tak się dzieje. Będzie świetnie, jeśli masz jakieś doświadczenie w debugowaniu tego rodzaju problemów, doceniam.
Dzięki, Howard
Jedyne, co mogę tu wymyślić, to kwestie zmiennoprzecinkowe, co oznacza, że równość nie pasuje do tych samych elementów, nie ma pojęcia, dlaczego byłby on właściwy dla wersji 4. Czy próbowałeś egzekwować poziom zaokrąglania? –
Spróbuj użyć typu danych "dziesiętny' zamiast podwójnego – Saravanan
. Nie ma żadnych innych wątków? Również ten wątek może być interesujący: http://stackoverflow.com/questions/6683059/are-floating-point-numbers-consistent-in-c-can-they-be –