【问题标题】:Mix upper and lower case is almost done but for-loop length is different number from fullname and letter length混合大小写几乎完成,但for循环长度与全名和字母长度不同
【发布时间】:2021-11-30 14:48:43
【问题描述】:

我用我的逻辑练习来改进,但我缺少两个 for 循环的数字,一个用于收集字母以从名称存储到数组中,另一个用于存储每个字母,请求字母将小写转换为名称中的大写。

对不起,我的英语很差。

示例控制台应用程序显示:

插入您的姓名:

约翰

插入任何要转换为大写的字母:

jn

输出: 约翰

我的代码如下:

        string name = "";
        Console.WriteLine("Insert your name");
        name = Console.ReadLine();

        string letter = "";
        Console.WriteLine("Insert of letter");
        letter = Console.ReadLine();

        char[] ch = name.ToCharArray();
        string[] name2 = new string[name.Length];


        char[] chletter = letter.ToCharArray();
        string[] letterArray = new string[chletter.Length];


        for (int i = 0; i < ch.Length; i++) //loop count of each letters from the names.
        {

            name2[i] = ch[i].ToString();// convert fullname into letters to store into string Name2

        }
        for (int i = 0; i < letterArray.Length; i++)
        {
            letterArray[i] = chletter[i].ToString().ToUpper();
        }
        for (int i = 0; i < letterArray.Length; i++)
        {
            if (name2[i].ToUpper() == letterArray[i]) // Find letter from name2 array when you ask for.
            {
                name2[i] = letterArray[i];
            }
        }
        for (int i = 0; i < name2.Length; i++)// display value from array
        {
            Console.Write(name2[i]);

        }

【问题讨论】:

  • string.Join("", name.Select(c =&gt; letter.IndexOf(c) == -1 ? c : Char.ToUpper(c)))... 请edit 澄清您得到的输出以及您已经进行的调试。理想情况下,您为此代码显示单元测试,显示您的期望和您得到的......

标签: c# arrays loops uppercase lowercase


【解决方案1】:

您应该能够在不使用索引的情况下在一个循环中完成它,这应该可以消除您的无效索引问题

var name = Console.ReadLine().ToCharArray();
var lettersToChange = Console.ReadLine().ToCharArray().ToHashSet();

var builder = new StringBuilder();
foreach (var letter in name)
{
    var newLetter = lettersToChange.Contains(letter) 
        ? Char.ToUpper(letter) 
        : letter;
    builder.Append(newLetter);
}

var result = builder.ToString();

【讨论】:

  • 除了给出解决方案外,请解释为什么你做了你所做的事情(参见指南)——尤其是空合并运算符可能难以阅读
  • @riffnl:上面的代码中没有 null 合并运算符 - 它是一个 三元 运算符。
  • @KenWhite 我已更正
【解决方案2】:

这听起来像是一个家庭作业,但无论如何这里有一些提示......

1- 您可以像这样创建新数组:

string[] letterArray = new string[chletter.Length];

但这实际上不是 chkletter 字符串的“值”,它只是一个大小相同的新数组(但没有实际内容)

2- 创建字符数组的部分(参见 1)

 char[] chletter = letter.ToCharArray();

已经是同一个数组(但有实际内容)

3- 为什么每次运行该循环时都要将单个字符转换为字符串并转换为大写?

letterArray[i] = chletter[i].ToString().ToUpper();

如果您只需执行一次,会不会更容易(并且性能更好)?

最后

4- 如果您已经将字符串转换为大写,您能否找到一种方法在单个循环中比较这些字符中的 任何 个字符?

这不是恶毒,而是想想你的要求和你试图实现的目标。

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2013-08-12
    • 2013-03-05
    • 2018-10-31
    • 1970-01-01
    相关资源
    最近更新 更多