Pergunta

Trabalhando no Visual Studio 2008 (C#) ... Eu uso uma coleção de listas para armazenar instâncias da minha classe personalizada (turno).

Quero excluir uma certa mudança da lista usando o método Remover.

Mas list.remove () sempre exclui o primeiro item que encontra.

Eu implementei a interface iComparável para o meu turno, achei que isso seria suficiente, então adicionei uma implementação do IequalityCompare e ainda não tem efeito.

Aqui está o trecho com minha implementação:

Membros da região

    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

Membros da Região IequalityCompare

    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

E, no entanto, ainda assim - quando a lista contém dois turnos, diga "8:00 - 15:00"; "12:00 - 16:00", chamando Remover ("12: 00-16: 00") Resultados em "8:00 - 15:00" sendo removidos, e o último permanece na coleção!

O que há de errado aqui? THX

Foi útil?

Solução

Você pode substituir object.GetHashCode e 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);
}

Você provavelmente também deve fazer um check -in nulo Equals(x, y).

Outras dicas

IComparable normalmente não é usado para comparar a igualdade (é usado para pedir), então List<T>.Remove() ignora.

IEqualityComparer não é um equivalente a IComparable Para fins de igualdade. Deve ser implementado por um objeto comparador - isto é, um objeto que compara outros objetos para igualdade. Se você deseja que as comparações de igualdade sejam inerentes à sua classe, então você precisa implementar IEquatable<T>. Ou apenas substituir Object.Equals() e Object.GetHashCode() em sua classe, sem implementar nenhuma interfaces.

Remover usos EqualityComparer<T>.Default Para determinar a igualdade e escolher qual objeto remover, que usará IEquatable<T> Se for implementado em seu objeto, caso contrário, ele usará a igualdade de referência.

Você tem duas opções para obter o comportamento que deseja:

1) Torne o implemento de mudança IEquatable<T> (não apenas substituir o objeto.equals ou fazer o método, mas faça turno - Shift : IEquatable<Shift>)

2) Use List<T>.RemoveAt

Com o exemplo que você forneceu, você está ligando:

List<Shift>.Remove("12:00 - 16:00");

"12:00 - 16:00" neste caso, é um String valor e não um real Shift objeto. Certifique -se de que em seu CompareTo Método de que seu código está lançando corretamente o String valor para a Shift objeto. Caso contrário, quando compara os horários de início ... as coisas podem dar um maldito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top