Как это может быть не равным? - PullRequest
2 голосов
/ 12 августа 2010
  1. Моя цель: извлечь одно значение из Excel Range и убедиться, что значение этих ячеек в этом диапазоне одинаковое;
  2. Когда значение ячейки не совпадает с другим, мне нужно вернуть ноль.

Вот кусок кода:

internal object GetValueFromCells(string start, string end, Formats format) {
    // Verifying for empty or null parameters here and throwing accordingly...

    try {
        Range cells = Excel.get_Range(start, end) as Range;

        object value = null;
        bool sameValue = false;

        foreach(Range cell in cells) {
            // This condition block shall execute only once, since 'value' shall not be null afterwards.
            if (value == null || value == DBNull.Value)
                if (Formats.Formated == format) {
                    value = cell.Text;
                    // The following results to be false !?...
                    sameValue = value == cell.Text; // Shall this not be true?
                } else {
                    value = cell.Value2;
                    // The following results to be false !?...
                    sameValue = value == cell.Value2; // Shall this not be true?
                }

            // This results being always false!?...
            // Shall this not be true, I wonder?
            sameValue = Formats.Formated == format ? value == cell.Text : value == cell.Value2; 

            if(!sameValue)
                return null;
        }

        return value;
    } catch (Exception ex) {
        // Exception handling...
    }
}

Читая этот код, я смиренно ожидал, что значение будет возвращено, когда все ячейки в диапазоне имеют одинаковое значение (например, 334).

Однако этот метод всегда возвращает ноль (ничего в Visual Basic)!

Кто-нибудь может объяснить, что мне здесь не хватает, пока это:

value == cell.Value2

всегда возвращает false ?

Возможно, мой алгоритм не совсем верен?

РЕДАКТИРОВАТЬ # 1

Это решило проблему:

sameValue = Formats.Formatted == format ? cell.Text.Equals(value) : cell.Value2.Equals(value);

Я принял ответ @Jerod Houghtelling, так как в его ответе предлагаются методы ToString () и Equals () для решения проблемы.

В дополнение к этому, мне не нравится вызывать метод ToString (), так как значение может быть числом, а сравнение чисел под строкой мне кажется странным. Поэтому я предпочитаю метод Equals (), который я использовал в своем решении.

Я хотел бы поблагодарить @Sir Gallahad и @Jerod Houghtelling за их хорошие ответы. Это был первый раз, когда мне пришлось столкнуться с такой ситуацией, и они оба помогли мне лучше понять, что происходит под капотом, плюс другие, которые тоже внесли свой вклад через комментарии.

И спасибо тем, кто проголосовал за мой вопрос. Это служит для демонстрации того, что я не так глупо спрашиваю! = P Хехехе ...

Ответы [ 2 ]

3 голосов
/ 12 августа 2010

Я предполагаю, что cell.Value2 возвращает новый экземпляр объекта каждый раз, когда вы вызываете его.Поэтому я бы сделал вывод, что == проверяет, являются ли обе стороны уравнения одним и тем же экземпляром объекта.Чтобы реально сравнить значения, хранящиеся на обеих сторонах, вам придется использовать .Equals или преобразовать значения во что-то, что можно сравнить, например строку.t value устанавливается в вашем примере.

3 голосов
/ 12 августа 2010

Вероятно, value == cell.Value2 сравнивает объекты из разных экземпляров.

Попробуйте value.ToString() == cell.Value2.ToString()

...