Поле комбинированного списка C# Update связывается с универсальным списком

Во-первых, вам нужно понять, почему в первую очередь стоит реализовать equals. Когда вы проводите сравнение примитивных типов, таких как целые числа, становится совершенно очевидно, как они сравниваются. Java не нуждается в какой-либо помощи, чтобы сказать, 1==1 Но для класса, который вы создаете сами, как Student, Java не знает, что означает равенство. Единственное, что он может проверить самостоятельно - это ссылочное равенство ; то есть, указывают ли две переменные на один и тот же объект в памяти. Однако обычно это бесполезно, поэтому вместо этого мы должны написать собственный метод и определить, когда два объекта равны, проверяя внутренние детали каждого из них. (Если вы уже все это знали, извините, но с таким же успехом можете быть внимательны)

Похоже, что ваш класс Student определил равенство как истинное, когда два Student объекта имеют одно и то же regNumber. [ 1122]

Давайте рассмотрим, что он делает, шаг за шагом:

    if (this == obj)
        return true;

this ссылается на ссылку на текущий экземпляр объекта Student, вызывающего этот метод . Другими словами, это не что иное, как указатель на объект. Таким образом, оператор if выполняет проверку, которая гласит: «Если эта ссылка на объект и ссылка на объект переданы в точке одному и тому же объекту, верните true». По сути, это избавляет нас от необходимости сравнивать какие-либо их внутренние детали, потому что, если два объекта проходят ссылочное равенство, они должны быть равны.

    if (obj == null)
        return false;

Довольно понятно. Если переданная ссылка на другой объект является нулевой, она не может быть равна этому объекту, поэтому верните false.

    if (getClass() != obj.getClass())
        return false;

Эта строка выполняет сравнение на основе типов классов. Таким образом, если этот объект (a Student) не относится к тому же типу класса, что и переданный объект, снова они не могут быть равны, поэтому возвращают false.

    Student other = (Student) obj;
    if (regNumber == null) {
        if (other.regNumber != null)
            return false;
    } else if (!regNumber.equals(other.regNumber))
        return false;
    return true;

Теперь для настоящего мяса сравнения. Сначала мы приводим переданный Object обратно в тип Student. Затем сравните regNumber каждого объекта (сначала подтвердите, что ни один из них не является null, чтобы избежать NullPointerException. Если они не равны, мы возвращаем false, в противном случае возвращаем true.

Обратите внимание, что если вы если добавить дополнительные поля в Student, они будут проигнорированы в том, что касается равенства, если только вы не добавите способ учесть их в своем методе equals. То есть поля не «автоматически повторяются через ", вы должны вручную и намеренно добавить все поля, которые должны считаться релевантными для равенства объектов.

13
задан Fueled 11 January 2009 в 20:35
поделиться

1 ответ

Самый легкий путь вокруг этого состоял бы в том, чтобы просто использовать BindingList как так:

private List<string> mAllianceList = new List<string>();
private BindingList<string> bindingList;    

private void FillAllianceList()
{
    // Add alliance name to member alliance list
    foreach (Village alliance in alliances)
    {
        mAllianceList.Add(alliance.AllianceName);
    }

    bindingList = new BindingList<string>(mAllianceList);

    // Bind alliance combobox to alliance list
    this.cboAlliances.DataSource = bindingList;
}

Затем отсюда на, просто имейте дело с обязательным списком, чтобы добавить и удалить объекты оттуда. Это удалит его и из Списка и из ComboBox.

Править: Для ответа на вопрос относительно сортировки я предполагаю самое легкое (но возможно "hacky" способ сделать это было бы что-то вроде этого:

mAllianceList.Sort();
bindingList = new BindingList<string>(mAllianceList);
this.cboAlliances.DataSource = bindingList;

Так в основном после сортировки Вы создаете новый обязательный список и сбрасываете источник данных. Возможно, существует более изящный способ пойти об этом, однако это должно работать.

15
ответ дан 2 December 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: