C # нужна помощь, чтобы убедиться, что несколько вхождений одной и той же буквы отмечены как число - PullRequest
0 голосов
/ 29 сентября 2018

Я программирую периодическую таблицу для моего школьного проекта на C #.Я хочу сделать так, чтобы, если я нажму (например) кнопку H 3 раза, она отобразится как H3.Теперь он работает только до H2, и я понятия не имею, почему?Любая помощь приветствуется заранее.

    private void btn_H_Click(object sender, EventArgs e)
    {
        txt_Chemical.Text = txt_Chemical.Text + "H";
        txt_Mass.Text = txt_Mass.Text + 1.006;
        int count = txt_Chemical.Text.TakeWhile(c => c == 'H').Count();
        if(count > 1)
        {
            txt_Chemical.Text = "H" + count;
            txt_Mass.Text = txt_Mass.Text + 1.006 * count;
        }
    }

1 Ответ

0 голосов
/ 29 сентября 2018

У меня сейчас нет средств, чтобы проверить, верно ли это сейчас, но попробуйте:

Я думаю, это (работа до двух нажатий H) может быть связано с этой строкой в ​​вашем коде:

int count = txt_Chemical.Text.TakeWhile(c => c == 'H').Count();

Вот как работает TakeWhile - он просматривает список с самого начала и останавливается при первом появлении, которое не удовлетворяет предикату..

Итак, когда вы делаете:

txt_Chemical.Text = "H" + count;

Ваша третья буква становится значением, которое содержит счет.Поэтому в следующий раз, когда TakeWhile разрывается на втором элементе как «HH2» .TakeWhile (c => c == 'H') возвращает коллекцию из двух элементов.(количество нажатий на H).

Дополнительно:

  • используйте var вместо int до count - если вы измените тип позже, это поможет
  • , если вы заботитесь оточность - и для химикатов я полагаю, что вы делаете, не используйте двойной (1,006).Используйте десятичные дроби, которые гарантируют точность (1,006 м).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...