C# 在子字符串上使用string.ToUpper

C# 在子字符串上使用string.ToUpper,c#,string,C#,String,分配一个任务,允许用户用C语言输入一个单词,然后显示该单词,第一个和第三个字符改为大写。代码如下: namespace Capitalizer { class Program { static void Main(string[] args) { string text = Console.ReadLine(); char[] delimiterChars = { ' ' };

分配一个任务,允许用户用C语言输入一个单词,然后显示该单词,第一个和第三个字符改为大写。代码如下:

namespace Capitalizer
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = Console.ReadLine();
            char[] delimiterChars = { ' ' };
            string[] words = text.Split(delimiterChars);
            string Upper = text.ToUpper();
            Console.WriteLine(Upper);
            Console.ReadKey();
        }
    }
}
这当然会生成整个大写单词,这不是我想要的。我似乎无法使text.ToUpper0,2起作用,即使这样,前三个字母也会大写。我现在能想到的唯一办法是将大写字母和小写字母移动到一个字符数组中,并尝试以修改后的顺序打印所有值。

您可以使用LINQ:

var upperCaseIndices = new[] { 0, 2 };
var message = "hello";
var newMessage = new string(message.Select((c, i) =>
  upperCaseIndices.Contains(i) ? Char.ToUpper(c) : c).ToArray());
下面是它的工作原理。消息。选择内联查询从消息中逐个选择字符并传递到选择器函数:

upperCaseIndices.Contains(i) ? Char.ToUpper(c) : c
写得好像是。它的读取方式就像数组中存在索引一样,然后选择大写字符。否则按原样选择字符

(c, i) => condition
这是一个很好的例子。另见:

其余的非常简单-将结果表示为字符数组。ToArray,并基于该新字符串创建一个新字符串

我现在能想到的唯一解决办法是将大写字母和小写字母移动到字符数组中,并尝试以修改后的顺序打印所有值,这将使单词出现在一行上,我不知道是否有效

这似乎比必要的要复杂得多。一旦有了一个字符数组,就可以简单地更改该字符数组的元素。在一个单独的函数中,它看起来像

string MakeFirstAndThirdCharacterUppercase(string word) {
  var chars = word.ToCharArray();
  chars[0] = chars[0].ToUpper();
  chars[2] = chars[2].ToUpper();
  return new string(chars);
}
我的简单解决方案:

string text = Console.ReadLine();
        char[] delimiterChars = { ' ' };
        string[] words = text.Split(delimiterChars);

        foreach (string s in words)
        {
            char[] chars = s.ToCharArray();

            chars[0] = char.ToUpper(chars[0]);
            if (chars.Length > 2)
            {
                chars[2] = char.ToUpper(chars[2]);
            }
            Console.Write(new string(chars));
            Console.Write(' ');
        }
        Console.ReadKey();

我能想到的解决您所描述的确切问题的最简单方法是将输入的第一个和第三个字符转换为大写,如下所示:

StringBuilder sb = new StringBuilder(text);

sb[0] = char.ToUpper(sb[0]);
sb[2] = char.ToUpper(sb[2]);

text = sb.ToString();
StringBuilder类本质上是一个可变的字符串对象,因此在执行这些类型的操作时,是解决问题的最灵活的方法,因为它提供了最直接的字符串操作的转换。在许多数据结构中,更改单个字符很容易,但插入、删除、追加、格式化等都是StringBuilder提供的,因此与其他方法相比,使用这些方法是一个好习惯


但坦率地说,很难看出这是一个多么有用的操作。我忍不住想知道您是否错误地说明了要求,并且这个问题还有比这里看到的更多的地方。

您在哪里使用子字符串。。?这是一个比你知道的更复杂的问题。Unicode是一种可变长度编码,因此第一个和第三个可见字符可能不是文本[0]和文本[2]。第一个和第三个字符更改为大写-您写得正确吗?如果是这样的话,你为什么要拆线?语言与这个问题有什么关系?相反,如果单词是相关的,a为什么不在代码中使用它,b请在你的问题中解释它是如何相关的,以及这里的实际要求是什么。赋值的逐字说明如下:编写一个程序,提示用户输入全小写的单词。将第一个和第三个字母转换为大写,然后输出字符串。words是我试图将字符串放入数组中的,好的。但你为什么要这么做?问题陈述似乎不需要这些,也不涉及任何类型的数组。另外,请注意,当您收到关于您的问题的任何评论的通知时,除非您在用户名后面键入@符号,否则评论者通常不会知道您已回复。例如@AB.我不认为OP会理解这个令人敬畏的答案,因为子字符串函数比lambda和?:操作符更容易理解,顺便说一句,这个答案很棒+1@MethodMan:谢谢。我添加了一些带有链接的解释。希望现在更容易消化@CoryNelson:我知道最有效的解决方案是使用简单的for循环+字符串生成器+if检查索引是否为0或2。然而,我认为效率目前不在OP的范围之内。在任何情况下,都可以在下面添加您的答案。@neolik,带下划线的答案,很好!非常感谢。这个任务看起来很忙,但实际上是:编写一个程序,提示用户输入一个全小写的单词。将第一个和第三个字母转换为大写并输出字符串。谢谢,但ToUpper似乎不能处理ChararraySwird。我一直没有得到方法ToUpper接受0个参数的重载。无论哪种方式,作业都成功完成。您是否将上面的代码复制并粘贴到主方法中?恭喜你完成了任务