私はtblDetailオブジェクトのリストを持っています。 tblDetailsには文字列txtTrackedがあります。私はこのプロパティに基づいてソートしたい。だから私は:List.Sort私のIComparerが矛盾していると主張する
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;
//...
}
時々txtTrackedはnullを除いて。罰金、[OK]をので、私は実行します。
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;
//...
}
定期昇順ソート正常に動作しますが、私は同じデータセットに降順の並べ替えでこれを行う際に、何らかの理由で、私はでLHSにnull参照の例外を取得"追跡されたY/N-desc"。私はない:
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;
//...
}
今だけ私は新しいエラーを取得する:
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.
与えるもの?それは一方的な方法ではなく、他方の方法ではうまく機能します。私のソート機能が十分ではないとC#がどのように判断し、どうすれば正しいのですか?
そして、私が並べ替えを呼び出すと、なぜ私のリストにnullが追加されるのですか?
lhsとrhsの両方がヌルの場合、0を返し、1のように戻らなくてはなりません。 – Evk
'CompareTo'の結果を否定することは、ソートを元に戻す確実な方法ではありません。 'int.MinValue'を正しく処理しません。ソートを元に戻すには、オペランドの順序を逆にする必要があります。 – Servy