簡體   English   中英

C#foreach與字符串-忽略最后一個字符

[英]C# foreach with string - ignore last character

我有一個方法,將從字符串中解析出來的數字加在一起。

如果用戶類型:“ 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

它錯過了最后一個值,因為只有在找到+時才添加數字。 因此,對於最后一個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;
}

僅當遇到+時,才將數字添加到數字集合中。 那最后一個數字呢? 之后沒有“ +”。

您應該添加unparsedNumberparsedNumbers最后人數太多。

您可以做一個更優雅的版本:

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;
        }
}

似乎您想要的只是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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM