Member 12349103 Ответов: 2

C# math.max не возвращает результатов.


Я хочу получить максимальное значение между 2 столбцами и вернуть его в третий столбец, если они совпадают с этими значениями.

Каждая строка в отладке показывает значение. за исключением d3, где значение должно быть помещено после того, как оно определяет самое высокое значение.

Идеи о том, что я делаю неправильно?

Образ Degug
Image - TinyPic - бесплатный хостинг изображений, обмен фотографиями и видеохостинг[^]



decimal d1 = decimal.Parse(string.IsNullOrEmpty(rows.Cells[41].Value.ToString()) ? "0" : rows.Cells[41].Value.ToString());
                decimal d2 = decimal.Parse(string.IsNullOrEmpty(rows.Cells[46].Value.ToString()) ? "0" : rows.Cells[46].Value.ToString());
                decimal d3 = decimal.Parse(string.IsNullOrEmpty(rows.Cells[37].Value.ToString()) ? "0" : rows.Cells[37].Value.ToString());
                decimal AL = Math.Max(d1, d2);
                AL = Math.Max(d3,AL);


Что я уже пробовал:

приведенный выше код должен работать, возвращаемый столбец является пустым st start with.

Eric Lynch

Здесь отладчик-ваш друг. Вещи, которые я бы исследовал в отладчике...

1) Каковы значения ваших входных столбцов: строк.Ячейки[41].значение, строки.Ячейки[46].значение и строки.Ячейки[37].Значение?
2) Каковы результаты ваших преобразований: d1, d2 и d3?
3) каков результат вашей промежуточной максимальной операции: AL?
4) каков результат вашей окончательной максимальной операции: AL?
5) каков ваш ожидаемый результат и чем он отличается от вашего фактического результата?

Я гарантирую, что одна из этих вещей (вероятно, пункты 1 или 2) - это не то, что вы думаете.

Люди здесь не могут видеть ваш экран или запустить отладчик для вас, поэтому мы находимся в невыгодном положении.

Как минимум, вы должны улучшить свой вопрос, чтобы указать фактические входные значения (столбцы 37, 41 и 46), фактическое выходное значение (AL) и ожидаемое выходное значение. Если возникнут какие-либо ошибки, вы также должны включить эту информацию.

Кстати, вместо запятой.Разбор, вы можете хотеть рассматривать десятичные.Метод tryparse. Последнее позволяет вам более эффективно перехватывать и обрабатывать недопустимые входные данные.

0x01AA

"Каждая строка в debug показывает значение. за исключением d3...." Что это значит? Как d3 может не показывать значение?

Member 12349103

Я загрузил ссылку на отладчик, не зная, как добавить изображение
d1=28,444
d2=28,444
d3=0
AL=28,444

0x01AA

А что плохого в результате? AL действительно имеет значение, которое я ожидал бы, потому что Max(d1, d2) - это 28.444, которое вы сначала храните в AL, и поэтому Max(d3, AL) снова вернет 28.444 (и снова назначит AL), потому что d3 кажется нулевым.... Я не вижу в этом проблемы...

Eric Lynch

Надеюсь, это не двойной пост. Мой предыдущий комментарий, похоже, отсутствует.

Как отмечает 0x01AA, правильный (математический) максимум для этих трех чисел (0, 28.444 и 28.444) равен 28.444. А чего ты ожидал?

В более раннем комментарии вы утверждаете, что отладчик "не показывает значение" для d3. Это вызывает недоумение в двух отношениях. Во-первых, это должно быть невозможно для типа значения (который по умолчанию равен нулю). Во-вторых, это не согласуется с приведенным выше утверждением...что значение d3 равно "0".

Возможно, вы забыли поделиться тем, что произошло исключение (и поделиться текстом исключения)?

Я еще раз повторю, что IsNullOrEmpty-это не единственный недопустимый входной текст. Например, "Микки Маус" не является допустимым десятичным числом. Вот почему я настоятельно рекомендую вам либо добавить блок try/catch, либо использовать decimal.TryParse вместо decimal.Parse.

2 Ответов

Рейтинг:
7

Patrice T

Цитата:
Я хочу получить максимальное значение между 2 столбцами и вернуть его в третий столбец, если они совпадают с этими значениями.

Этот код вычисляет максимум 3 значения и не пытается сохранить результат в другом столбце.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладка кода C# в Visual Studio - YouTube[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
0

OriginalGriff

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

Первое, что вам нужно сделать, это разбить отладчик и внимательно посмотреть, что именно происходит, когда вы запускаете этот код с вашими данными: поместите точку останова в строку

AL = Math.Max(d3,AL);
и посмотрите, что там внутри. d1, d2, d3, и AL
Это должно дать вам ключ к пониманию того, что происходит, и вы можете посмотреть поближе на соответствующие данные / код, как только у вас это будет.

Извините, но мы ничего не можем сделать для вас!