C#foreach with string - 忽略最后一个字符

时间:2017-07-06 13:20:22

标签: c# algorithm

我有一个方法,可以从字符串中解析数字。

如果用户输入:“52 + 7 + 1”,则会产生(60) “52 ++ 2 + 3”,“52 + c + 2”,“+ 52 + 2”,“52 + 2 ++”,......将无效。

我的代码几乎完美无缺,期待......它忽略了最后一个字符。它可以在代码中为字符串添加“+0”,但当然它会阻止用户输入“+”作为最后一个字符。

    public int addFromString(string str)
    {
        bool valid_str = true;
        bool current_char_numeric = false;

        string unparsedNumber = "";
        int parsedNumber = 0;
        List<int> parsedNumbers = new List<int>();

        if (string.IsNullOrEmpty(chaine))
            chaine_valide = false;
        else
        {
            if (!int.TryParse(str[0].ToString(), out parsedNumber))
               valid_str = false;

            if (!int.TryParse(str[str.Length - 1].ToString(), out parsedNumber))
                valid_str = false;
        }

        foreach (char c in str)
        {
            current_char_numeric = int.TryParse(c.ToString(), out parsedNumber);

            if (current_char_numeric)
                unparsedNumber += c;
            else if(c == '+')
            {
                int.TryParse(unparsedNumber, out parsedNumber);
                parsedNumbers.Add(parsedNumber);

                if (str.IndexOf(c) < str.Length && str.ElementAt(str.IndexOf(c) + 1) == '+')
                    valid_str = false;

                //Just in case :
                unparsedNumber = "";
                current_char_numeric = int.TryParse(c.ToString(), out parsedNumber);
            }
            else valid_str = false;
        }

        int result = 0;

        if(valid_str) { foreach(int n in parsedNumbers) { result += n; } }

        return result;
}

所以如果我输入:“52 + 2”我得到52

如果我输入:“52 + 2 + 6”我得到54

4 个答案:

答案 0 :(得分:1)

它错过了最后一个值,因为如果找到+,您只会添加数字。因此,对于上一个unparsedNumber,您永远不会输入else if (c == '+')块。

让我建议一个更紧凑的解决方案:

public int addFromString(string str)
{
    string trimmed = str.Trim();
    if (str.StartsWith("+") || str.EndsWith("+")) return 0; // invalid -> return immediatly

    // split string at "+" and trim parts
    string[] numbers = str.Split('+').Select(s => s.Trim()).ToArray();
    int result = 0;
    foreach(string number in numbers)
    {
        int n;
        if (!int.TryParse(number, out n)) return 0; // invalid -> return
        result += n;
    }

    return result;
}

答案 1 :(得分:0)

当您遇到+时,您只需在数字集合中添加一个数字。 最后一个号码怎么样?之后没有'+'。

您也应将unparsedNumber添加到parsedNumbers以获取最后一个号码。

答案 2 :(得分:0)

你可以做一个更优雅的版本:

public int addFromString(string str)
{
        int parsedNumber = 0;            
        int result = 0;

        if (string.IsNullOrEmpty(chaine))
        {
            return result;
        }
        else
        {
            if (!int.TryParse(str[0].ToString(), out parsedNumber)
                 || !int.TryParse(str[str.Length - 1].ToString(), out parsedNumber))
            {
                 return result;
            }
        }

        try
        {
             result = str.Split(new char[] { '+' }).Select(s => Convert.ToInt32(s)).Sum();
        }
        finally
        {
             return result;
        }
}

答案 3 :(得分:0)

似乎你想要的只是Split

  string source = "52+7+1";

  int sum = 0;                // initial sum is 0
  bool chaine_valide = true;  // the chain is valid (we don't have any counter examples)

  // Split on terms: 52, 7, 1
  foreach (string term in source.Split('+')) {
    int value;

    // No need in Trim() etc. - TryParse is smart enough
    if (int.TryParse(term, out value))
      sum += value;          // valid term: add it up
    else {
      chaine_valide = false; // counter example: term is not a valid integer

      break;
    }
  }

  ...

  Console.Write(chaine_valide ? sum.ToString() : "Invalid formula");

如果是 C#7.0 ,您可以(在out var的帮助下)将代码简化为

  int sum = 0;                // initial sum is 0
  bool chaine_valide = true;  // the chain is valid (we don't have any counter examples)

  // Split on terms: 52, 7, 1
  foreach (string term in source.Split('+')) 
    if (int.TryParse(term, out var value))
      sum += value;          // valid term: add it up
    else {
      chaine_valide = false; // counter example: term is not a valid integer

      break;
    }