LinQ, отличный с пользовательским компаратором, оставляет дубликаты

Вы могли бы найти следующее сообщение полезным: http://refactoringin.net/?p=36

, Как это сказано в сообщении, не отбрасывайте полную перезапись настолько легко. Кроме того, если вообще возможный, попытайтесь заменить целые слои или уровни со сторонним решением как, например ORM для персистентности или с новым кодом. Но самый важный из всех, попытайтесь понять логику (проблемная область) позади кода.

9
задан Vaccano 2 November 2009 в 22:55
поделиться

2 ответа

Да, вам нужно изменить идентификатор класса вашего объекта, если вы хотите, чтобы несколько версий сосуществовали. Однако вы можете поддерживать независимый от версии идентификатор программы , такой как «Word.Application» или «InternetExplorer.Application», который перенаправляет на идентификатор класса текущей версии . Поддерживать обратную совместимость очень сложно. MSXML, по-видимому, отказался от практики независимого от версии progID.

Если вы решите сохранить старые интерфейсы (рекомендуется), вам необходимо реализовать как новые, так и старые интерфейсы в вашем новом объекте.

Вы можете проверить Microsoft Office реестр выходит. Он довольно хорошо поддерживает обратную совместимость.

Предлагаемое имя нового интерфейса будет состоять из имени интерфейса плюс номер версии, например IHtmlDocument6 .

t правильно реализовать IEqualityComparer .

Когда вы реализуете IEqualityComparer , вы должны реализовать GetHashCode , чтобы любые два равных объекта имеют тот же хэш-код.

В противном случае вы получите неправильное поведение, как вы видите здесь.

Вы должны реализовать GetHashCode следующим образом: (любезно предоставлено этот ответ )

public int GetHashCode(List<SupplierCategory> obj) {
    int hash = 17;

    foreach(var value in obj)
        hash = hash * 23 + obj.GetHashCode();

    return hash;
}

Вы также необходимо переопределить GetHashCode в SupplierCategory для обеспечения согласованности. Например:

public override int GetHashCode() {
    int hash = 17;
    hash = hash * 23 + Name.GetHashCode();
    hash = hash * 23 + Parent.GetHashCode();
    return hash;
}

Наконец, хотя вам это и не нужно, вам, вероятно, следует переопределить Equals в SupplierCategory и заставить его вызывать реализованный вами метод Equals для IEquatable .

Когда вы реализуете IEqualityComparer , вы должны реализовать GetHashCode , чтобы любые два равных объекта имели одинаковый хэш-код.

В противном случае вы приведет к неправильному поведению, как вы видите здесь.

Вы должны реализовать GetHashCode следующим образом: (любезно предоставлено этот ответ )

public int GetHashCode(List<SupplierCategory> obj) {
    int hash = 17;

    foreach(var value in obj)
        hash = hash * 23 + obj.GetHashCode();

    return hash;
}

Вам также необходимо переопределить GetHashCode в SupplierCategory , чтобы быть последовательным. Например:

public override int GetHashCode() {
    int hash = 17;
    hash = hash * 23 + Name.GetHashCode();
    hash = hash * 23 + Parent.GetHashCode();
    return hash;
}

Наконец, хотя вам это и не нужно, вам, вероятно, следует переопределить Equals в SupplierCategory и заставить его вызывать реализованный вами метод Equals для IEquatable .

Когда вы реализуете IEqualityComparer , вы должны реализовать GetHashCode , чтобы любые два равных объекта имели одинаковый хэш-код.

В противном случае вы приведет к неправильному поведению, как вы видите здесь.

Вы должны реализовать GetHashCode следующим образом: (любезно предоставлено этот ответ )

public int GetHashCode(List<SupplierCategory> obj) {
    int hash = 17;

    foreach(var value in obj)
        hash = hash * 23 + obj.GetHashCode();

    return hash;
}

Вам также необходимо переопределить GetHashCode в SupplierCategory , чтобы быть последовательным. Например:

public override int GetHashCode() {
    int hash = 17;
    hash = hash * 23 + Name.GetHashCode();
    hash = hash * 23 + Parent.GetHashCode();
    return hash;
}

Наконец, хотя вам это и не нужно, вам, вероятно, следует переопределить Equals в SupplierCategory и заставить его вызывать реализованный вами метод Equals для IEquatable .

вы должны реализовать GetHashCode , чтобы любые два равных объекта имели одинаковый хэш-код.

В противном случае вы получите неправильное поведение, как видите здесь.

Вам следует реализовать GetHashCode следующим образом: (любезно предоставлено этот ответ )

public int GetHashCode(List<SupplierCategory> obj) {
    int hash = 17;

    foreach(var value in obj)
        hash = hash * 23 + obj.GetHashCode();

    return hash;
}

Вам также необходимо переопределить GetHashCode в SupplierCategory , чтобы обеспечить согласованность. Например:

public override int GetHashCode() {
    int hash = 17;
    hash = hash * 23 + Name.GetHashCode();
    hash = hash * 23 + Parent.GetHashCode();
    return hash;
}

Наконец, хотя вам это и не нужно, вам, вероятно, следует переопределить Equals в SupplierCategory и заставить его вызывать реализованный вами метод Equals для IEquatable .

вы должны реализовать GetHashCode , чтобы любые два одинаковых объекта имели одинаковый хэш-код.

В противном случае вы получите неправильное поведение, как вы видите здесь.

Вам следует реализовать GetHashCode следующим образом: (любезно предоставлено этот ответ )

public int GetHashCode(List<SupplierCategory> obj) {
    int hash = 17;

    foreach(var value in obj)
        hash = hash * 23 + obj.GetHashCode();

    return hash;
}

Вам также необходимо переопределить GetHashCode в SupplierCategory , чтобы обеспечить согласованность. Например:

public override int GetHashCode() {
    int hash = 17;
    hash = hash * 23 + Name.GetHashCode();
    hash = hash * 23 + Parent.GetHashCode();
    return hash;
}

Наконец, хотя вам это и не нужно, вам, вероятно, следует переопределить Equals в SupplierCategory и заставить его вызывать реализованный вами метод Equals для IEquatable .

(любезно предоставлено этот ответ )

public int GetHashCode(List<SupplierCategory> obj) {
    int hash = 17;

    foreach(var value in obj)
        hash = hash * 23 + obj.GetHashCode();

    return hash;
}

Вам также необходимо переопределить GetHashCode в SupplierCategory для согласованности. Например:

public override int GetHashCode() {
    int hash = 17;
    hash = hash * 23 + Name.GetHashCode();
    hash = hash * 23 + Parent.GetHashCode();
    return hash;
}

Наконец, хотя вам это и не нужно, вам, вероятно, следует переопределить Equals в SupplierCategory и заставить его вызывать реализованный вами метод Equals для IEquatable .

(любезно предоставлено этот ответ )

public int GetHashCode(List<SupplierCategory> obj) {
    int hash = 17;

    foreach(var value in obj)
        hash = hash * 23 + obj.GetHashCode();

    return hash;
}

Вам также необходимо переопределить GetHashCode в SupplierCategory для согласованности. Например:

public override int GetHashCode() {
    int hash = 17;
    hash = hash * 23 + Name.GetHashCode();
    hash = hash * 23 + Parent.GetHashCode();
    return hash;
}

Наконец, хотя вам это и не нужно, вам, вероятно, следует переопределить Equals в SupplierCategory и заставить его вызывать реализованный вами метод Equals для IEquatable .

11
ответ дан 4 December 2019 в 13:48
поделиться

Собственно, этот вопрос даже описан в документации: http://msdn.microsoft.com/en-us/library/bb338049.aspx .

4
ответ дан 4 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

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