我在网上找了很久,但没有找到任何有用的东西 我正在try 从用户那里获取一个号码,然后使用它来:

  1. 写下那个产品的名称.
  2. 在最后展示他们想要订购的一切
  3. 计算一下订单的价格.

因此,如果他们说1,2,5,它会打印"cpu2,gpu.100000".我只想知道如何添加第二部分,以获得用户的输入,然后列出所有他们在最后.

string[] computer = { "Cpu", "Gpu", "Ram", "Hard", "Motherboard" };
int[] price = { 30000, 70000, 20000, 25000, 40000 };
Console.WriteLine("0 = Cpu , 1=Gpu , 2=Ram 3,=Hard 4=Motherboard", "each Time Put Number For Your Order , Put 5 To Calculate");

Start:

Console.Write("Enter What You Want To Order : ");
int num = Convert.ToInt32(Console.ReadLine());
List<string> list = new List<string>();
**list.Add(computer[num]);** (This is the part that shows the error
if (num < 5)
{
    Console.WriteLine(computer[num]);
    goto Start;
}
else if (num == 5)
{
    Console.WriteLine("Finished Proccess");
    goto Next;
}
else
{
    Console.WriteLine("Not Valid");
}

Next:

foreach (var lol in list)
{
    Console.WriteLine(lol);
}

我试着使用list.add,但不起作用-list.Add(computer[num]);

推荐答案

我对您的代码做了一些更改,使其按照您的要求工作.

首先,正如@jdweng在comment中指出的那样,您需要移动列表before Start:的赋值,因为使用Goto:将返回到该点,并在每次迭代中将列表重置为new().还要注意的是,你只需要在列表中存储integers来记录你购买的所有商品,所以你可以使用List<int>而不是List<string>.我把它叫做order:

List<int> order = new List<int>();

Start:

对于选件if (num == 5)else,您不会购买任何东西,因此您需要在if (num < 5)块内的订单only中添加.Add个新项目,这就是您购买项目时的情况:

if (num < 5)
{
    Console.WriteLine(computer[num]);
    order.Add(num);

    goto Start;
}

最后,为了显示订单中所有商品的列表,由于两个数组computerprice循环遍历列表orders,因此对于每个订单,都要打印商品名称和价格.在每次迭代中,您还将价格添加到变量totalPrice,以跟踪订单的总成本,并在最后打印出来:

Next:

Console.WriteLine("You ordered:");

int totalPrice = 0;

foreach(var item in order)
{
    Console.WriteLine($"\t{computer[item]} {price[item]}");

    totalPrice += price[item];
}

Console.WriteLine($"Total: {totalPrice}");

总而言之,完整的程序如下所示:

string[] computer = { "Cpu", "Gpu", "Ram", "Hard", "Motherboard" };
int[] price = { 30000, 70000, 20000, 25000, 40000 };
Console.WriteLine("0 = Cpu , 1=Gpu , 2=Ram 3,=Hard 4=Motherboard", "each Time Put Number For Your Order , Put 5 To Calculate");

List<int> order = new List<int>();

Start:

Console.Write("Enter What You Want To Order : ");
int num = Convert.ToInt32(Console.ReadLine());

if (num < 5)
{
    Console.WriteLine(computer[num]);
    order.Add(num);

    goto Start;
}
else if (num == 5)
{
    Console.WriteLine("Finished Proccess");
    goto Next;
}
else
{
    Console.WriteLine("Not Valid");
}

Next:

Console.WriteLine("You ordered:");

int totalPrice = 0;

foreach(var item in order)
{
    Console.WriteLine($"\t{computer[item]} {price[item]}");

    totalPrice += price[item];
}

Console.WriteLine($"Total: {totalPrice}");
Console.ReadLine();

我同意@Narish的观点,你可能应该避免使用Goto:Start:Next:,因为它会让代码更难读,让你的代码变得脆弱、不必要的复杂,容易出现错误和脆弱(参见what is wrong with using goto?).相反,您可以使用whileforforeach个循环来控制程序的执行流.

还要考虑到C#数组和集合中的索引是0-based,这意味着第一个位置是0,第二个位置是1,依此类推.因此,在您的示例中:

所以如果他们说1、2、5,它会打印"CPU、GPU

1和2对应于GPU和RAM,不对应于CPU和GPU.

Csharp相关问答推荐

Microsoft.AspNetCore.Mvc. Controller Base.用户:属性或索引器Controller Base.用户无法分配给--它是只读的

MongoDB实体框架核心:表达必须可写

错误NU 1301:无法加载源的服务索引

ListaryImportProperty的默认DllImportSearchPathsProperty行为

如何从泛型方法返回一个可为空的T,其中T:notnull?

EF Core 8—应用客户端投影后无法转换集操作

为什么C#Bigbit不总是相同的比特长度?

. NET JSON属性自定义所需逻辑

Polly使用泛型重试和重试包装函数

Quartz调度程序不调用作业(job)类

Blazor WebApp:原始异常:AADSTS700025:客户端是公共的,因此既不应显示客户端,也不应显示客户端

如何使用自定义负载均衡器管理Ocelot负载均衡器中的多线程和批读取

每个http请求需要60秒,为什么?

System.Text.Json .NET 8多形态语法化

在C#中,非静态接口方法的抽象和虚拟是冗余的吗?

数据库.Migrate在对接容器重启时失败

Blazor服务器项目中的Blazor/.NET 8/Web API不工作

如何在Polly重试策略成功之前将HttpClient请求排队?

C#中使用ReadOnlySpan的泛型类型推理

如何在C#中反序列化Java持续时间?