尝试阅读“按任意键继续”时,C#控制台程序Linq错误

时间:2018-10-07 15:56:19

标签: c#

我有

Console.WriteLine("\n");
Console.WriteLine("Press any key to continue...");

我正在尝试使其与以下代码一起使用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> details = new List<string>();
            Console.Write("Enter First Name: ");
            details.Add(Console.ReadLine());
            Console.Write("Enter Last Name: ");
            details.Add(Console.ReadLine());
            Console.Write("Enter Street: ");
            details.Add(Console.ReadLine());
            Console.Write("Enter City: ");
            details.Add(Console.ReadLine());
            Console.Write("Enter State: ");
            details.Add(Console.ReadLine());
            Console.Write("Enter Zip: ");
            details.Add(Console.ReadLine());

            Console.WriteLine("\n\nCustomer's Information:");

            var result = from detail in details
                         let upperCaseWord = UppercaseWords(detail)
                         select upperCaseWord;

            foreach (var item in result)
            {
                Console.WriteLine("{0}", item);
            }

            Console.ReadLine();
        }

        public static string UppercaseWords(string value)
        {
            char[] array = value.ToCharArray();

            if (array.Length >= 1)
            {
                if (char.IsLower(array[0]))
                {
                    array[0] = char.ToUpper(array[0]);
                }
            }

            for (int i = 1; i < array.Length; i++)
            {
                if (array[i - 1] == ' ')
                {
                    if (char.IsLower(array[i]))
                    {
                        array[i] = char.ToUpper(array[i]);
                    }
                }
            }
            return new string(array);
        }
    }
}

无论我输入

Console.WriteLine("\n");
Console.WriteLine("Press any key to continue...");

它会导致错误或显示不正确(在单词之前,单词中间,但不是在应该显示的页面的最后)。我知道这似乎是一个简单的问题,但我感到非常困惑和迷茫。我似乎无法弄清楚我在这里做错了什么?任何帮助都将是美好的!

这是应该执行的作业:

  1. 创建字符串列表。

  2. 使用Console.ReadLine()收集firstName,lastName,街道,城市,州,邮政编码的值,并将其保存到列表中。

  3. 编写一个简单的Linq语句,调用方法UppercaseWords()将首字母更改为大写。

  4. 创建一个foreach语句以显示信息。

因此,我相信我可以使所有其他工作正常进行,但是我对为什么该程序最简单的部分无法正常工作感到困惑。

任何帮助将不胜感激。非常感谢!

1 个答案:

答案 0 :(得分:-1)

自从您说过:“任何帮助,我们将不胜感激”,我想我将花一些时间来分享一些有关如何使您的程序更好的想法。我并不是说这是唯一的方法,甚至不是最好的方法,但希望它能给您一些思考和提高技能的机会。

作为程序员的目标之一是编写尽可能少的代码。这是您的一些代码重复执行相同的操作,只是稍作更改。

   Console.Write("Enter First Name: ");
   details.Add(Console.ReadLine());
   Console.Write("Enter Last Name: ");
   details.Add(Console.ReadLine());

通过消除所有重复的代码,我们可以做得更好:首先要注意的是,唯一的区别是您输入的数据的“名称”,因此将所有名称收集到一个地方:

//static - only 1 copy of this data is ever needed
//readonly - these values should never be changed
static readonly List<string> DataNames = new List<string>() { "First Name", "Last Name", 
                                                              "Street", "City", "State", "Zip"};

现在编写一个可以输入值的函数:

static string ReadDataPairFromConsole( string DataName )
{
    Console.Write("Enter {0}: ", DataName );
    return Console.ReadLine();
}

现在所有数据都可以用一行输入:

DataNames.ForEach(name => details.Add(ReadDataPairFromConsole(name)));

由于每个单词都需要大写,因此代码可以遵循您编写的逻辑并处理整个输入列表。但是,也可以像这样输入时处理每个输入:

static string ReadDataPairFromConsole( string DataName )
{
    Console.Write("Enter {0}: ", DataName );
    return FirstLetterUpper(Console.ReadLine());
}

您还可以利用内置函数对单个单词执行FirstLetterUpper(有一些不检查的边缘情况):

 var upWord = char.ToUpper(InputString[0]) + InputString.Substring(1);

我还要进行许多其他更改,例如使用对使输入标签与输入字符串匹配。然后,当输出数据时,就知道每块是什么。

祝您学习顺利!