首页 > 解决方案 > 循环遍历数组,将值相互绑定

问题描述

在 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 循环可能,但如何?我不知道从哪里开始。非常感谢帮助!

标签: c#arraysloops

解决方案


有更好的方法吗?

像这样的匹配数组是一种反模式,并且表明您应该真正创建一个具有价格、商品和购物车属性的类。然后你可以有一个数组,你可以循环一次。

但是即使使用这种反模式,您仍然可以做您需要的事情:

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 选项(尽管它通常是相反的),即使它的代码更多。


推荐阅读