C#-List< T> .Remove()は常にリストの最初のオブジェクトを削除します

StackOverflow https://stackoverflow.com/questions/1434580

質問

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> を作成します)

2) List< T> .RemoveAt

提供した例では、次のように呼び出しています:

List<Shift>.Remove("12:00 - 16:00");
この場合の

&quot; 12:00-16:00&quot; は、 String 値であり、実際の Shift オブジェクトではありません。コードである CompareTo メソッドで、 String 値を Shift オブジェクトに正しくキャストしていることを確認してください。それ以外の場合、開始時間を比較するときに...物事がうまくいかない可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top