如何解决C# 列表框 foreach
我正在学习 c# 并且我正在尝试窗口窗体应用程序(特别是列表框)继承人我的代码我想知道为什么当我在列表框中选择多个项目时(奶酪、火腿、培根)的值没有相加
private void button1_Click(object sender,EventArgs e)
{
int pizza = 0;
if (comboBox1.SelectedItem == "Hawaiian")
{
pizza = pizza + 100;
}
else if (comboBox1.SelectedItem == "Pepparoni")
{
pizza = pizza + 150;
}
else if (comboBox1.SelectedItem == "Special")
{
pizza = pizza + 200;
}
foreach (string item in listBox1.SelectedItems)
if (listBox1.SelectedItem == "Cheese")
{
pizza = pizza + 25;
}
if (listBox1.SelectedItem == "Ham")
{
pizza = pizza + 50;
}
if (listBox1.SelectedItem =="Bacon")
{
pizza = pizza + 70;
}
textBox1.Text = pizza.ToString();
}
解决方法
在 { }
循环中使用 foreach
大括号。并移动使用 else if
(它将解决问题以及代码的性能)。
if (listBox1.SelectedItem == "Cheese")
{
pizza = pizza + 25;
}
else if (listBox1.SelectedItem == "Ham")
{
pizza = pizza + 50;
}
else if (listBox1.SelectedItem =="Bacon")
{
pizza = pizza + 70;
}
,
您也可以使用 LINQ 来获得预期的结果:
var values = new Dictionary<string,int>
{
["Cheese"] = 25,["Ham"] = 50,["Bacon"] = 70
};
pizza += listBox1.SelectedItems.Select(x => values.TryGetValue(x,out int value) ? value : 0).Sum();
这会让你的代码更紧凑,更容易扩展(如果你想添加一个成分,你只需要在你的字典初始化中添加一行)。
,当您在 SelectedItems 列表上循环时 - 您使用了 foreach 但您没有使用循环变量“item” - 而是您一直在检查 SelectedItem。
我认为以下对您有用:
foreach (string item in listBox1.SelectedItems)
{
if (item == "Cheese")
pizza = pizza + 25;
else if (item == "Ham")
pizza = pizza + 50;
else if (item =="Bacon")
pizza = pizza + 70;
}
,
您会混淆两件事:SelectedItem 和 SelectedItems 是不同的属性。 Vivek 指出您的代码存在一个问题,因为 for 循环下缺少圆括号意味着 for 循环仅在第一个 if
上运行,但这不是真正的问题;是的,这意味着循环将运行 3 次,因为在选定项目集合中有 3 个东西,但是当您在循环中时,您不使用 SelectedItem 来引用您当前在前面的 SelectedItems 上循环的项目。在允许多选的列表框中,SelectedItem 总是只返回第一个选择的项目。
相反,我们应该真正将列表框中的内容换成具有项目文本和价格的内容(毕竟这是面向对象的编程!),我们应该遍历其中选定的内容并添加涨价
首先,让我们开设一堂课来展示我们的浇头和价格:
public class Topping {
public string Name {get; set;}
public int Price {get; set;}
public override ToString() {
return Name;
}
}
我们覆盖 ToString 因为这是列表框在找到自定义类型的项目时调用的内容;如果我们不这样做,我们的列表框就会一遍又一遍地包含单词 Topping,因为默认情况下 ToString 只返回类的名称
接下来我们将浇头放入我们的列表框中。将您的列表框重命名为 toppingsListbox - 永远不要保留 listbox1 等的默认名称;这让以后的工作变得非常困难:
toppingsListbox.Items.Add(new Topping { Name = "Cheese",Price = 25 });
toppingsListbox.Items.Add(new Topping { Name = "Chilii Oil",Price = 35 });
随心所欲地继续
现在我们可以遍历 SelectedItems,将它们变回它们真正的浇头并加起来它们的价格:
foreach(var x in toppingsListbox.SelectedItems){
var topping = x as Topping;
pizzaPrice += Topping.Price
}
然后将您的文本框设置为您添加的价格
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。