【问题标题】:Characters to uppercase with C#. Jaden Casing Strings kata用 C# 将字符转为大写。 Jaden 套管串 kata
【发布时间】:2021-10-24 12:58:28
【问题描述】:

这是我在这里的第一个问题。我正在尝试通过 Code Wars 练习来提高我的基础知识,并且我应该将每个单词的第一个字符更改为大写。

示例:这就是我现在的生活 --> 这就是我现在的生活

这是我目前的代码,但大写字母似乎无法正常工作。为什么?

public static string ToJadenCase(string phrase)
        {
            for (int i = 0; i < phrase.Length; i++)
            {
                char _first = phrase[0];
                if (phrase[i] == ' ')
                {
                    i++;
                    char.ToUpper(phrase[i]);
                }
                else if(phrase[i] == _first)
                {
                    char.ToUpper(phrase[i]);
                }
            }
            return phrase;
        }

谢谢大家!从您的回答中,我能够创建一种工作方法。很高兴加入这样的社区。​​p>

我的最终代码使用了一个列表来完成这项工作,虽然不是很漂亮,但它通过了。

public static string ToJadenCase(string phrase)
        {
            List<char> _textlist = new List<char>();
            _textlist.Add(char.ToUpper(phrase[0]));

            for (int i = 1; i < phrase.Length; i++)
            {                  
                if (phrase[i] == ' ')
                {
                    _textlist.Add(phrase[i]);                        
                    _textlist.Add(char.ToUpper(phrase[i + 1]));
                    i++;
                }
                else
                {
                    _textlist.Add(phrase[i]);
                }                  
            }
            return string.Join("",_textlist);
        }

【问题讨论】:

  • 你对这个问题有什么限制吗?
  • char.ToUpper 返回一个char - 它不会进行就地更新
  • 转换为大写,当您刚刚检查它是一个空格时,似乎没有意义。但是您确实需要将下一个字符大写
  • 我在检查空后将 1 添加到 i 以更改下一个字符。但是如果它只是返回值而不是替换它,这应该是像phrase[i] = char.ToUpper(phrase[i]); ?对此没有任何限制。
  • 要就地处理,您需要将输出转换为变量,然后从方法中返回该变量。

标签: c# visual-studio toupper


【解决方案1】:

有多种方法,但您的代码倾向于数组操作。我们可以使用StringBuilder 来协助进行简单的基于数组的替换:

这里有描述C# Replace or Remove Char by Index

public static string ToJadenCase(string phrase)
{
    // record the output as we process the input
    var output = new System.Text.StringBuilder(phrase);
    char _first = phrase[0];
    for (int i = 0; i < phrase.Length; i++)
    {
        if (phrase[i] == ' ')
        {
            i++;
            output[i] = char.ToUpper(phrase[i]);
        }
        else if(phrase[i] == _first)
        {
            output[i] = char.ToUpper(phrase[i]);
        }
    }
    return output.ToString();
}

注意:我只是在这里转换了你的逻辑,我不保证你会通过这个测试用例,你应该检查边界条件,比如为 phrase 传入的 null 或空字符串,或者以空格开头的字符串...

我也不确定与第一个字符的比较是什么,所以我不会对此发表评论,作为 Code WarsHackerrank 问题我会相信你的话,这是要求的一部分。

【讨论】:

    【解决方案2】:

    如果没有特定的附加条件,那么这应该可以解决问题:

    public static void Main()
    {
        var c = "to jaden case";        
        var str = c.Split(' ')
                   .Select(x => x.Length > 1 ? Char.ToUpper(x[0]) + x[1..] : x.ToUpper());
                    
        var result = string.Join(' ', str);
        Console.WriteLine(result);
    }
    

    如果需要,您还可以在字符串拆分后将所有部分转换为小写,如果可能有一个小写/大写的字符串放在不同的位置。在连接多个空格时,还有一个关于额外空格字符的问题,但为此我省略了。

    【讨论】:

      【解决方案3】:

      您可以通过以下非常简单的方式使用 StringBuilder

      public static string ToJadenCase(string phrase)
              {
                  if (phrase.Length == 0)
                      Console.WriteLine("Empty string");
      
                  string[] WordsList = phrase.Split();
                  StringBuilder builder = new StringBuilder();
                  foreach (var word in WordsList)
                  {
                      builder.Append(char.ToUpper(word[0]) + word.Substring(1)).Append(" ");
                     
                  }
                  return builder.ToString();
              }
      

      【讨论】:

        猜你喜欢
        • 2012-01-08
        • 2010-10-18
        • 2014-06-18
        • 2021-06-11
        • 2018-09-16
        • 2016-01-10
        • 1970-01-01
        • 2013-08-02
        相关资源
        最近更新 更多