c# - 循环遍历数组,将值相互绑定
问题描述
在 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 循环可能,但如何?我不知道从哪里开始。非常感谢帮助!
解决方案
有更好的方法吗?
像这样的匹配数组是一种反模式,并且表明您应该真正创建一个具有价格、商品和购物车属性的类。然后你可以有一个数组,你可以循环一次。
但是即使使用这种反模式,您仍然可以做您需要的事情:
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}");
在这种情况下, index 选项可能更快,并且更容易理解 linq 选项(尽管它通常是相反的),即使它的代码更多。
推荐阅读
- javascript - 为 Feather M4 Express 寻找与 usb_cdc 等效的 CircuitPython 模块
- python - pandas.DataFrame() AttributeError: 'Index' 对象没有属性 '_ndarray_values'
- json - Talend Open Studio:对 REST API 进行身份验证
- ansible - 如何确保没有手动更改 RabbitMQ 配置
- r - 在 ROUT 文件中屏蔽来自 foreach 的“启动工作人员”消息
- sql-server - 将 .csv 文件导入/加载到 SQL Server 表中
- python - 类和定义 __str__
- ruby-on-rails - 顺风没有在heroku上编译
- reactjs - 带有 React 的单选按钮
- azure-devops - Azure Devops - 使用 tfvc 存储库从 API 下载文件