C#-List< T> .Remove()は常にリストの最初のオブジェクトを削除します
-
07-07-2019 - |
質問
Visual Studio 2008(C#)での作業... リストコレクションを使用して、カスタムクラスのインスタンスを格納します(Shift)。
Removeメソッドを使用して、リストから特定のシフトを削除したい。
ただし、List.Remove()は、最初に見つかったアイテムを常に削除します。
ShiftにIComparableインターフェイスを実装しました。これで十分だと思い、IEqualityComparerの実装を追加しましたが、まだ効果はありません。
ここに私の実装の抜粋を示します:
リージョンIComparableメンバー
public int CompareTo(object obj) { Shift s1 = this; Shift s2 = (Shift)obj; if (s1.start.time != s2.start.time) return s1.start.CompareTo(s2.start); else return s1.end.CompareTo(s2.end); }
endregion
地域IEqualityComparerメンバー
public bool Equals(Shift x, Shift y) { if ((x.opening) != (y.opening)) return false; if ((x.closing) != (y.closing)) return false; if (!x.opening) if (x._start != y._start) return false; if (!x.closing) if (x._end != y._end) return false; if (x.when != y.when) return false; if (x.day != y.day) return false; if (x.EmployeeID != y.EmployeeID) return false; return true; } public int GetHashCode(Shift obj) { return obj.ToString().ToLower().GetHashCode(); }
endregion
それでも、まだ-リストに2つのシフトが含まれている場合、「8:00-15:00」と言います。 " 12:00-16:00"、Remove(" 12:00-16:00")を呼び出すと" 8:00-15:00"削除され、後者はコレクションに残ります!
ここで何が問題なのですか? Thx
解決
object.GetHashCode
および object.Equals
をオーバーライドできます:
public override bool Equals(object obj)
{
if(obj == null)
{
return false;
}
return Equals(this, obj as Shift);
}
public override int GetHashCode()
{
return this.GetHashCode(this);
}
Equals(x、y)
でnullチェックも行う必要があります。
他のヒント
IComparable
は通常、等しいかどうかの比較に使用されないため(順序付けに使用されます)、 List< T> .Remove()
はそれを無視します。
IEqualityComparer
は、平等の目的で IComparable
と同等ではありません。 比較オブジェクト、つまり、他のオブジェクトが等しいかどうかを比較するオブジェクトによって実装されることになっています。クラスに固有の等値比較が必要な場合は、 IEquatable< T>
を実装する必要があります。または、インターフェイスを実装せずに、クラスで Object.Equals()
および Object.GetHashCode()
をオーバーライドします。
Removeは、 EqualityComparer< T> .Default
を使用して、等しいかどうかを判断し、削除するオブジェクトを選択します。 、参照の平等を使用します。
必要な動作を取得するには、2つのオプションがあります:
1)Shiftに IEquatable< T>
(Object.Equalsをオーバーライドするかメソッドを作成するだけでなく、Shift- Shift:IEquatable< Shift>
を作成します)
提供した例では、次のように呼び出しています:
List<Shift>.Remove("12:00 - 16:00");
この場合の &quot; 12:00-16:00&quot;
は、 String
値であり、実際の Shift
オブジェクトではありません。コードである CompareTo
メソッドで、 String
値を Shift
オブジェクトに正しくキャストしていることを確認してください。それ以外の場合、開始時間を比較するときに...物事がうまくいかない可能性があります。