【问题标题】:Make every other a-z letter Upper / Lower case, ignoring whitespace将所有其他 a-z 字母设为大写/小写,忽略空格
【发布时间】:2017-05-11 06:34:21
【问题描述】:

有人可以告诉我我做错了什么吗?似乎无法获得预期的输出,即忽略空格,只忽略大写/小写 a-z 字符,而不管空格字符的数量是多少

我的代码:

var sentence = "dancing sentence";
var charSentence = sentence.ToCharArray();
var rs = "";
for (var i = 0; i < charSentence.Length; i++)
{
    if (charSentence[i] != ' ')
    {
        if (i % 2 == 0 && charSentence[i] != ' ')
        {
            rs += charSentence[i].ToString().ToUpper();
        }
        else if (i % 2 == 1 && charSentence[i] != ' ')
        {
            rs += sentence[i].ToString().ToLower();
        }
    }
    else
    {
        rs += " ";
    }
}
Console.WriteLine(rs);

预期输出:DaNcInG sEnTeNcE

实际输出:DaNcInG SeNtEnCe

【问题讨论】:

  • 查看索引时,您的空间仍然被计算在内。
  • 在执行 % 2 之前为空格添加一个计数器并减少它的形式索引。
  • 你能用flag代替for循环吗?或者只是循环可接受的@MykolaKovalchuk
  • 用空格分割句子,格式化每个单词并将它们连接起来。
  • C# 有很多用于字符串操作的方法。您不需要遍历并执行 mod 运算符。使用 IsUpper() 或 IsLower() 等方法获得更优雅的解决方案。 This 帖子将帮助您完善您的示例。

标签: c#


【解决方案1】:

我使用flag 而不是i,因为(正如你提到的)空白使这个算法工作错误:

var sentence = "dancing sentence";
var charSentence = sentence.ToCharArray();
var rs = "";
var flag = true;
for (var i = 0; i < charSentence.Length; i++)
{

    if (charSentence[i] != ' ')
    {
        if (flag)
        {
            rs += charSentence[i].ToString().ToUpper();
        }
        else
        {
            rs += sentence[i].ToString().ToLower();
        }
        flag = !flag;
    }
    else
    {
        rs += " ";
    }
}
Console.WriteLine(rs);

【讨论】:

    【解决方案2】:

    尝试一个只有两个状态的简单有限状态自动机 (upper == true/false);另一个建议是使用StringBuilder:

    private static string ToDancing(string value) {
      if (string.IsNullOrEmpty(value))
        return value;
    
      bool upper = false;
    
      StringBuilder sb = new StringBuilder(value.Length);
    
      foreach (var c in value) 
        if (char.IsLetter(c)) 
          sb.Append((upper = !upper) ? char.ToUpper(c) : char.ToLower(c));
        else
          sb.Append(c);
    
      return sb.ToString();
    }
    

    测试

    var sentence = "dancing sentence";
    
    Console.Write(ToDancing(sentence)); 
    

    结果

    DaNcInG sEnTeNcE
    

    【讨论】:

      【解决方案3】:

      我认为您应该再声明一个名为isUpper 的变量。现在你有两个变量,i 表示你接下来要迭代的字符的索引,isUpper 表示一个字母是否应该是大写。

      你像往常一样增加i,但首先将isUpper设置为true:

      // before the loop
      boolean isUpper = true;
      

      然后,与其检查i 是否能被2 整除,不如检查isUpper

      if (isUpper)
      {
          rs += charSentence[i].ToString().ToUpper();
      }
      else
      {
          rs += sentence[i].ToString().ToLower();
      }
      

      紧跟在上述 if 语句之后,“翻转”isUpper:

      isUpper = !isUpper;
      

      【讨论】:

        【解决方案4】:

        Linq 版本

        var sentence = "dancing sentence";
        int i = 0;
        string result = string.Concat(sentence.Select(x => { i += x == ' ' ? 0 : 1; return i % 2 != 0 ? char.ToUpper(x) : char.ToLower(x); }));
        

        旁注:

        请将charSentence[i].ToString().ToUpper() 替换为char.ToUpper(charSentence[i])

        【讨论】:

          【解决方案5】:

          感谢@Dmitry Bychenko。最佳方法。但我认为根据 OP(可能是一个更新鲜的......)的心态,解决方案可能是什么。在这里,我将代码作为另一种解决方案。

          冗长的代码。我自己不喜欢但仍然代表

          class Program
          {
              static void Main(string[] args)
              {
                  var sentence = "dancing sentence large also";
                  string newString = string.Empty;
                  StringBuilder newStringdata = new StringBuilder();
          
                  string[] arr = sentence.Split(' ');
                  for (int i=0; i< arr.Length;i++)
                  {
                      if (i==0)
                      {
                          newString = ReturnEvenModifiedString(arr[i]);
                          newStringdata.Append(newString);
                      }
                      else
                      {
                          if(char.IsUpper(newString[newString.Length - 1]))
                          {
                              newString = ReturnOddModifiedString(arr[i]);
                              newStringdata.Append(" ");
                              newStringdata.Append(newString);
                          }
                          else
                          {
                              newString = ReturnEvenModifiedString(arr[i]);
                              newStringdata.Append(" ");
                              newStringdata.Append(newString);
                          }
                      }
                  }
                  Console.WriteLine(newStringdata.ToString());
                  Console.Read();
              }
          
              //For Even Test
              private static string ReturnEvenModifiedString(string initialString)
              {
                  string newString = string.Empty;
                  var temparr = initialString.ToCharArray();
                  for (var i = 0; i < temparr.Length; i++)
                  {
                      if (temparr[i] != ' ')
                      {
                          if (i % 2 == 0 && temparr[i] != ' ')
                          {
                              newString += temparr[i].ToString().ToUpper();
                          }
                          else
                          {
                              newString += temparr[i].ToString().ToLower();
                          }
                      }
                  }
                  return newString;
              }
          
              //For Odd Test
              private static string ReturnOddModifiedString(string initialString)
              {
                  string newString = string.Empty;
                  var temparr = initialString.ToCharArray();
                  for (var i = 0; i < temparr.Length; i++)
                  {
                      if (temparr[i] != ' ')
                      {
                          if (i % 2 != 0 && temparr[i] != ' ')
                          {
                              newString += temparr[i].ToString().ToUpper();
                          }
                          else
                          {
                              newString += temparr[i].ToString().ToLower();
                          }
                      }
                  }
                  return newString;
              }
          }
          

          输出

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-06-06
            • 2013-12-11
            • 1970-01-01
            • 2019-08-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-29
            相关资源
            最近更新 更多