【问题标题】:c# Cut String at Capital Letterc# 在大写字母处剪切字符串
【发布时间】:2016-02-08 11:08:01
【问题描述】:

我想做一个小程序,其中每个原子的原子质量基本上都有很多双精度数。我希望能够将分子公式写入文本框,之后程序应该能够计算摩尔质量,但是,我不知道如何从文本框中剪切字符串,例如我可以从插入“NaCl”进入文本框,我的 Na double 的值加上我的 Cl double 的值。

namespace WindowsFormsApplication33
{
    public partial class Form1 : Form
    {
        double H = 1.00794;
        double He = 4.002602;
        double Li = 6.941;
        double Be = 9.012182;
        ...

这些只是我所有的双打,现在我想要一个按钮来做:

        private void button1_Click(object sender, EventArgs e)
        {
            //take the different atoms in the molecule formula from a textbox,
            //get the value of all those doubles, and add them all together to get
            //a final value, for instance: NaCl = Na + Cl = 22.98976928 + 35.453 = 58.44276928
        }

另外,我希望能够编写 H2SO4,它本质上是 H*2 + S + O*4,我该怎么做呢?

提前谢谢你

【问题讨论】:

  • 向我们展示您的尝试。
  • 我们有幸继续制作这个程序。如果您遇到困难,请随时提出有关特定问题的问题,并附上您尝试和研究过的内容。
  • 对不起,我不擅长解释,我经常使用很多特殊的语言,我希望这个编辑有助于理解我的问题,我想要两个单独的字符串,这样我可以从双精度中提取一个名称与字符串文本等效的值。
  • 尝试返回 Regex.Split(source, @"(?

标签: c# string


【解决方案1】:
Dictionary<string, double> Chemicals = new Dictionary<string, double>() { { "H", 1.00794 }, { "He", 4.002602 }, { "Li", 6.941 }, { "Be", 9.012182 } };
        List<string> Properties = new List<string>();

        Regex reg = new Regex("[A-Z]{1}[a-z0-9]*");
        Properties = reg.Matches(txtInput.Text).Cast<Match>().Select(m => m.Value).ToList();

        double Total = 0;
        foreach (var Property in Properties)
        {
            var result = Regex.Match(Property, @"\d+$").Value;

            int resultAsInt;
            int.TryParse(result, out resultAsInt);

            if (resultAsInt > 0)
            {
                Total += Chemicals[Property.Substring(0, Property.Length - result.Length)] * resultAsInt;
            }
            else
            {
                Total += Chemicals[Property];
            }

        }

        lblOutput.Text = "Total: " + Total.ToString();

【讨论】:

  • 好的,我用它来做我想做的事,你现在有什么办法可以帮我计算像 H2SO4 这样的东西,它本质上是 H*2 + S + O*4?
  • 我已经编辑了我的帖子以符合您在上面的要求。希望这对您有所帮助。使用化学值等键对值数据时,使用字典要好得多
  • 非常感谢,您几乎为我制作了整个程序,我唯一要改变的是为 if 语句中的 else 部分做一个 try catch,因为如果有人放入 for例如H2SO0,那么它实际上只是H*2 + S + O*0,这会出错。
  • 是的,我也不打算为你做验证。小心,不要忘记标记为完成。
【解决方案2】:
void Main()
{
    string text = "NiNaCiKi";
    Regex reg = new Regex("[A-Z]{1}[a-z]*");
    var props = reg.Matches(text).Cast<Match>().Select(m=>m.Value).ToList();

    Chem ch = new Chem();

    var sum = typeof(Chem)
    .GetProperties()
    .Where(p=>props.Contains(p.Name))
    .Cast<PropertyInfo>()
    .Select(val=> (double)val.GetValue(ch)).Sum();

    Console.WriteLine(sum);
}

public class Chem
{
    public double Na {get {return 4;}}
    public double N {get {return 2;}}
    public double Ci {get {return 1;}}
}

【讨论】:

  • 谢谢你,非常好,实际上我最终按照 Falling 的建议将我所有的双打都放入了字典中,但它的代码几乎相同,你能帮忙解决我问他的问题吗?跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 2019-06-08
  • 2017-07-29
相关资源
最近更新 更多