回答 请批评我的方法

WB1975

众所周知的成员
加入
4月3日,2020年
消息
87
编程经验
Beginner
此方法询问MIN和MAX字符之间的字符串

然后要求输入有效字符串的确认

请告诉我是否可以更有效地完成等等
C#:
public static string GetLimitedStringWithConfirmation(string prompt, int min, int max)
{
    do
    {
        Console.WriteLine(prompt);

        var userString = Console.ReadLine();

        if (userString.Length >= min && userString.Length <= max)
        {
            Console.Write($"You entered {userString} Do you accept [Y/N]: ");

            char ch = Console.ReadKey(true).KeyChar;
            ch = char.ToUpper(ch);
            switch (ch)
            {
                case 'Y':
                    return userString;
                case 'N':
                    Console.WriteLine("\nThe entry was rejected...");
                    break;
            }
        }
    } while (true);
}
 
最后编辑了主持人:

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,721
地点
悉尼,澳大利亚
编程经验
10+
鉴于它几乎是另一位在另一个线程中提供的成员的副本和粘贴,我不确定你的期望。此外,代码是这样做的,从那个角度来看,它是完美的。如果您要提供对您的目标的解释,而不是期望我们从代码中删除它,那么我们可能会发现一些问题。代码没有任何重要的错误,但我倾向于重命名最后两个参数,以指示真正的意思,即它们专门的最小和最大长度,但没有指示该方法的任何地方。这是一件小事,但我也倾向于将这两条线结合成一个:
C#:
char ch = Console.ReadKey(true).KeyChar;
ch = char.ToUpper(ch);
Finally, it's an even smaller thing but I'd also be inclined to call Console.WriteLine twice here, rather than including a line break in the text:
C#:
Console.WriteLine("\nThe entry was rejected...");
这只是一个更清晰的,因为没有文字线在其他任何地方都会破坏,所以可能会错过。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,721
地点
悉尼,澳大利亚
编程经验
10+
我忘了提到这里有一些标点符号也缺少:
C#:
Console.Write($"You entered {userString} Do you accept [Y/N]: ");
我可能会或可能不会使用问号,但我肯定至少去这一点:
C#:
Console.Write($"You entered \"{userString}\". Do you accept [Y/N]: ");
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,159
地点
挪威
编程经验
10+
我会将“获取确认”代码重构为单独的方法。此外,如果用户按不同的炭而多,则会发生什么?
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
考虑为交换机语句插入默认情况,因此如果不满足条件,它不会逐到。


Why do you need to write the prompt? If this is not needed, just set the var userString to 迅速的
 

WB1975

众所周知的成员
加入
4月3日,2020年
消息
87
编程经验
Beginner
谢谢所有人,

是的,我一起做了字符串代码,但确实必须以特定的目的来改变它,即时,我只是想从去的情况下学习正确的做法,我希望你能理解。

约翰:我会将“获得确认”代码重构为单独的方法。
我实际上没有任何方法,不知道我在想什么。

约翰 :如果用户按不同的is,会发生什么,而不是y / n?是的,它的行为像N / N不正确,也必须看看。

jmplhinney.: 也会看看!

sh: 将为我的交换机添加默认值,谢谢您的建议。

有任何其他人是否会想到可以添加到此实用程序类的任何其他有用方法?

一份菜单? 1到5和Q戒烟?

mod编辑。无需大胆。这是一点眼睛疼痛
 
最后编辑了主持人:

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,893
地点
切萨皮克,va.
编程经验
10+
我总是总是最终为控制台程序写作的那个是一个选择菜单。例如。我会用这样的东西称之为:
C#:
var favoriteArtist = ChooseOne<string>("Select your favorite artist:", "Enya", "Queen", "Dire Straights", "OMD", "John Williams");
var rouletteColor = ChooseOne<Color>("Place your bets on:", Color.Red, Color.Black);
这将在UI中显示:
C#:
Select your favorite artist:
1 - Enya
2 - Queen
3 - Dire Straights
4 - OMD
5 - John Williams
> 1
C#:
Place your bets on:
1 - Red
2 - Black
> 2

或者如果你真的是冒险的,请与莲花123样式菜单一样:
C#:
var favoriteArtist = ChooseOne<string>("Select your favorite artist: ", "&Enya", "&Queen", "&Dire Straights", "&OMD", "John &Williams");
var rouletteColor = ChooseOne<Color>("Place your bets on:", Color.Red, Color.Black, (color => color.ToString()[0]) );
这会出现:
C#:
Select your favorite artist: [E]nya, [Q]ueen, [D]ire Straights, [O]MD, John [W]illiams
> e
C#:
Place your bets on: [R]ed, [B]lack
> b
 
Last edited:

WB1975

众所周知的成员
加入
4月3日,2020年
消息
87
编程经验
Beginner
C#:
using System;
using System.Collections.Generic;
using System.Text;

namespace FootballLeague
{
    公共静态类ConsoleManager
    {

        public static int GetInt32(string prompt)
        {
            Console.WriteLine(prompt);

            var isValid = int.TryParse(Console.ReadLine(), out var number);

            while (!isValid)
            {
                Console.WriteLine("Please enter a valid number.");
                Console.WriteLine(prompt);

                isValid = int.TryParse(Console.ReadLine(), out number);
            }

            return number;
        }

        public static double GetDouble (string prompt)
        {
            Console.WriteLine(prompt);

            var isValid = double.TryParse(Console.ReadLine(), out var number);

            while (!isValid)
            {
                Console.WriteLine("Please enter a valid number.");
                Console.WriteLine(prompt);

                isValid = double.TryParse(Console.ReadLine(), out number);
            }

            return number;
        }

        public static bool GetYesNo(string prompt)
        {
            Console.Write($"{prompt} [Y/N]: ");
            while (true)
            {
                char ch = Console.ReadKey(true).KeyChar;
                ch = char.ToUpper(ch);
                switch (ch)
                {
                    case 'Y':
                    case 'N':
                        Console.WriteLine(ch);
                        return ch == 'Y';
                }
            }
        }

        public static string GetLimitedString(string prompt, int minCharacters, int maxCharacters)
        {
            do
            {
                Console.WriteLine(prompt);

                var userString = Console.ReadLine();

                if (userString.Length >= minCharacters && userString.Length <= maxCharacters)
                {
                    return userString;
                }
            } while (true);
        }
    }
}
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,721
地点
悉尼,澳大利亚
编程经验
10+
这是我注意到的另一件事

我制作了课堂
公共静态类ConsoleManager

这个课程是否需要静态?
声明类静态的重点是强制每个成员也是静态的,这具有阻止阶级的效果。如果您将在VB中使用模块,那么您应该在C#中使用静态类。您可以声明常规类静态的每个成员,但仍然可以通过默认构造函数实例化。如果不应实例化类型,那么您应该声明它静态。一个示例是声明扩展方法的类。这样的课程必须是静态的。
 

本杰姆玛

成员
加入
2020年6月2日
消息
14
编程经验
1-3
你认为我的班级应该是静态吗?
我猜我永远不想它实例化......所以是的?

此类是否应该是静态的,也不是我想到的设计问题。这取决于你如何使用该类的结束。我想如果你开始轮胎传递与这些方法相同的提示,这可能会激励你以不同的方式接近它。
 

本杰姆玛

成员
加入
2020年6月2日
消息
14
编程经验
1-3
对不起......什么是"开始轮胎传递与这些方法相同的提示"实际上是什么意思?只是打电话给他们?
是的,如果你开始发现它繁琐地称之为这些功能"prompt"您的程序中的参数。但我现在意识到我的理解"prompt"在你的代码中意味着不是你的意思......所以忽略了我的评论。
 
最佳 底部