Ich habe eine Liste von tblDetail-Objekten. tblDetails haben txtTracked, eine Zeichenfolge. Ich möchte basierend auf dieser Eigenschaft sortieren. also tue ich:List.Sort, die behauptet, dass mein IComparer inkonsistent ist
switch (sortby)
{
//...
case "Tracked Y/N":
list.Sort((lhs, rhs) => {
return lhs.txtTracked.CompareTo(rhs.txtTracked);
});
break;
case "Tracked Y/N-desc":
list.Sort((lhs, rhs) => {
return -lhs.txtTracked.CompareTo(rhs.txtTracked);
});
break;
//...
}
außer manchmal txtTracked ist null. Ok, gut, ich auch:
switch (sortby)
{
//...
case "Tracked Y/N":
list.Sort((lhs, rhs) => {
string toCompare = lhs.txtTracked;
if (toCompare == null)
toCompare = "";
return toCompare.CompareTo(rhs.txtTracked);
});
break;
case "Tracked Y/N-desc":
list.Sort((lhs, rhs) => {
string toCompare = lhs.txtTracked;
if (toCompare == null)
toCompare = "";
return -toCompare.CompareTo(rhs.txtTracked);
});
break;
//...
}
Die regelmäßige aufsteigend funktioniert Art in Ordnung, aber aus irgendeinem Grunde, wenn ich dies mit der absteigenden Sortierung auf dem gleichen Satz von Daten, erhalte ich eine null-Verweisausnahme auf lhs in "Nachverfolgte Y/N-Desc". so ich mache:
switch (sortby)
{
//...
case "Tracked Y/N":
list.Sort((lhs, rhs) => {
string toCompare = lhs.txtTracked;
if (toCompare == null)
toCompare = "";
return toCompare.CompareTo(rhs.txtTracked);
});
break;
case "Tracked Y/N-desc":
//for some reason this sort adds null into the list. wat.
list.Sort((lhs, rhs) => {
if (lhs == null)
return 1;
if (rhs == null)
return -1;
string toCompare = lhs.txtTracked;
if (toCompare == null)
toCompare = "";
return -toCompare.CompareTo(rhs.txtTracked);
});
list.RemoveAll(d => d == null);
break;
//...
}
erst jetzt habe ich eine neue Fehlermeldung erhalten:
Unable to sort because the IComparer.Compare() method returns inconsistent results. Either a value does not compare equal to itself, or one value repeatedly compared to another value yields different results.
was ist passiert? Es funktioniert gut in einer Richtung, aber nicht in der anderen. Wie entscheidet C#, dass meine Sortierfunktion nicht gut genug ist und wie kann ich das richtig machen?
und nebenbei, warum wird null in meine Liste hinzugefügt, wenn ich sort aufrufen?
Wenn sowohl lhs als auch rhs null sind, sollte es 0 und nicht 1 wie jetzt zurückgeben. – Evk
Das Negieren des Ergebnisses von 'CompareTo' ist keine zuverlässige Möglichkeit, eine Sortierung umzukehren; Es behandelt "int.MinValue" nicht korrekt. Sie sollten die Reihenfolge der Operanden umkehren, um die Sortierung umzukehren. – Servy