List <T>.Remove не удаляет объект - PullRequest
1 голос
/ 16 февраля 2020

Я реализую следующий код для удаления элемента из списка

// RemoveRole is a member function in a class for Person
// roles is defined as 
// List<PersonOrganisationRoleModel> roles;
// And properly populated prior to this function call

public void RemoveRole(string RoleName)
{
    // I am creating an object that needs to be matched in the list
    PersonOrganisationRoleModel role = new PersonOrganisationRoleModel(OrganisationID, PersonID, RoleName)

    // "role" is now properly constructed, and is matching an exact copy of one of the objects in "roles"
    // the expectation now is the the object "role" must be matched with one of the objects in "roles",
    // and that one be removed
    roles.Remove(role);

}

Но вызов функции «Удалить» из списка «ролей» не удаляет элемент в списке, который содержит точный те же значения.

Насколько я понимаю, это должно работать (это только обратное значение List.Add

Ответы [ 2 ]

4 голосов
/ 16 февраля 2020

Причина в том, что ваш объект роли не является членом списка и имеет другой адрес в памяти. Кстати, если вы переопределите метод Equals, как описано выше, вы сможете использовать его. Вы также можете удалить с помощью LINQ, как в этом примере.

roles.RemoveAll(r => r.OrganisationID == OrganisationID && r.PersonID == PersonID)

Это удалит все объекты в списке с помощью OrganisationID и PersonID.

3 голосов
/ 16 февраля 2020

Вам необходимо переопределить Equals() в классе PersonOrganisationRoleModel, в противном случае Remove() будет сравнивать объекты по ссылке, что будет false, поскольку role является новым объектом

public override bool Equals(object obj)
{
    if (obj == null)
    {
        return false;
    }

    PersonOrganisationRoleModel p = obj as PersonOrganisationRoleModel;
    if (p == null)
    {
        return false;
    }

    return this.OrganisationID == p.OrganisationID && this.PersonID == p.PersonID;
}

Если вы используете словари или наборы для хранения этого объекта, вы также должны переопределить GetHashCode()

public override GetHashCode()
{
    return OrganisationID.GetHashCode() ^ PersonID.GetHashCode();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...