C# 列表框 foreach

时间:2021-03-03 06:12:10

标签: c# foreach listbox

我正在学习 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();

    }

enter image description here

4 个答案:

答案 0 :(得分:1)

{ } 循环中使用 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;
}

答案 1 :(得分:0)

您也可以使用 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();

这会让你的代码更紧凑,更容易扩展(如果你想添加一个成分,你只需要在你的字典初始化中添加一行)。

答案 2 :(得分:0)

当您在 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;
}

答案 3 :(得分:0)

您会混淆两件事: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
}

然后将您的文本框设置为您添加的价格

相关问题