在Visual Studio中,使用C#,我得到了三个看起来像这样的数组:
int[] price = new int[] { 100, 200, 300, 400, 500, 600 };
string[] goods = new string[] { "item1", "item2", "item3", "item4", "item5", "item6" };
bool[] cart = new bool[] { false, false, false, false, false, false };
布尔型购物车代表复选框。现在,我要做的是使用一个按钮来检查选中了哪些复选框,然后从数组商品中获取商品名称,并从数组价格中获取商品价格。然后,我将这些字符串连接起来,加总起来,然后将其显示在MessageBox.Show中。
我想我需要以某种方式将购物车数组的索引与价格和商品数组的相应索引绑定。还是有更好的方法呢?可能是for循环,但是如何?我不确定从哪里开始。 非常感谢您的帮助!
答案 0 :(得分:3)
有更好的方法吗?
像这样的匹配数组是一种反模式,您实际上应该创建一个具有价格,商品和购物车属性的类的符号。然后,您可以拥有一个仅循环一次的数组。
但是即使使用这种反模式,您仍然可以做您需要做的事情:
var items = cart.Zip(goods, (c,g) => new {Cart = c, Good = g}).Zip(price, (a, p) => new {Cart = a.Cart, Good = a.Good, Price = p});
var ticked = items.Where(i => i.Cart);
var message = string.Join(",", ticked.Select(t => t.Good));
var sum = ticked.Select(t => t.Price).Sum();
MessageBox.Show($"{message}\nTotal: {sum}");
这也将起作用,并且可能意味着更少的内存使用:
var ticked = cart.Select((value,index) => new {Cart = value, Price = price[index], Good = goods[index]})
.Where(i => i.Cart);
var message = string.Join(",", ticked.Select(s => s.Good));
var sum = ticked.Select(s => s.Price).Sum();
MessageBox.Show($"{message}\nTotal: {sum}");
您还可以使用索引:
int sum = 0;
var message = new StringBuilder();
var delimiter = "";
for(int i = 0; i<cart.Length; i++)
{
if (cart[i])
{
sum += price[i];
message.Append(delimiter).Append(goods[i]);
delimiter = ",";
}
}
MessageBox.Show($"{message}\nTotal: {sum}");
在这种情况下,即使使用更多代码,索引选项也可能更快,并且对linq选项的理解也不再困难(尽管反之亦然)。
答案 1 :(得分:1)
这是一个绑定问题的简单示例。
我假设您为每个商品都有一个复选框,并且当状态更改时,bool[] cart
会在正确的索引处更改。
然后,您只需要保留该索引并添加正确的价格和商品,如下所示:
string shoppingCart += goods[i];
decimal cost += price [i];
但是,那是一个很大的数目,您不应该依赖于基于索引的太多数组。
如 icebat 在他的评论中所述,您应该实现一个代表您的物品的类。
示例:
public class Item
{
public int Id { get; set; }
public decimal Price { get; set; }
public string Name { get; set; }
}
答案 2 :(得分:1)
您可以尝试做的一件事是创建具有属性Good
,Name
,Price
等的类Cart
public class Good
{
public string Name { get; set; }
public int Price { get; set; }
public bool Cart { get; set;}
}
,然后将它们放在列表中。
List<Good> MyGoods = new List<Good>();
MyGoods.Add(new Good{ Name="item1", Price=100, Cart = false});
您可以在列表中添加任意数量的项目,然后使用索引或foreach
for(int i=0; i<MyGoods.Count;i++)
{
Console.WriteLine(MyGoods[i].Name);
}
或
foreach(Good g in MyGoods)
{
Console.WriteLine(g.Name);
}
答案 3 :(得分:0)
您绝对应该创建一个描述待售商品的对象。
但是,如果您想一起破解恐怖片,则可以执行以下操作...
int[] price = new int[] { 100, 200, 300, 400, 500, 600 };
string[] goods = new string[] { "item1", "item2", "item3", "item4", "item5", "item6" };
bool[] cart = new bool[] { false, false, true, false, false, true };
var selected = cart.Select((value,index) => new {value, index})
.Where(item => item.value == true)
.Select(item => item.index)
.ToList();
int total = 0;
foreach(var x in selected){
total += price[x];
}
//total is 900
答案 4 :(得分:0)
按照其他人的建议,使用数据模型或字典肯定会更好,但是如果您要坚持使用数组的原始代码,则可以使用以下代码:
int[] price = new int[] { 100, 200, 300, 400, 500, 600 };
string[] goods = new string[] { "item1", "item2", "item3", "item4", "item5", "item6" };
bool[] cart = new bool[] { false, false, false, false, false, false };
StringBuilder sb = new StringBuilder();
int totalPrice = 0;
for(int i = 0; i < cart.Length; i++)
{
if (!cart[i]) continue;
sb.Append(goods[i]);
totalPrice += price[i];
}
//Use sb.ToString() and totalPrice to show in Messagebox.
答案 5 :(得分:0)
尽管使用C#编码,但您不是面向对象的。
我同意@JoelCoehoorn关于您当前代码演示反模式的评论。下面是我使用对象定向解决方案。
由于price
和good
指向同一个对象,因此创建一个Item
类,并向其中添加成员String Name;
和double Price;
因为有一个Cart
,所以我确定购物车在商店中。因此,还要创建Store
类。
Store
类中,添加一个Dictionary<int, Item> AvailableItems;
,其中列出了商店中的所有可用商品(您也可以使用Dictionary而不是Dictionary来使用其他一些DS) 。接下来,来您商店购买商品的客户应为其分配唯一的ID。这需要一个Customer
类。 (可以为来宾用户分配一个新的随机ID)。
Dictionary<int, int> Cart;
,这是他们要购买的商品ID和商品数量的映射。最后,我们来到Order
对象,该对象包含一个Cart
,并具有一个名为PrintTotalSumFrom(Cart c)
的不错的方法,该方法完全可以满足您的要求。
我早些时候写的关于面向对象原理的一个有用的答案是here。