【问题标题】:What is my foreach mistake?我的 foreach 错误是什么?
【发布时间】:2014-02-05 14:54:13
【问题描述】:

我的 foreach 循环有问题。目的是遍历列表框中的项目,并且对于每个项目,它应该将人的属性设置为等于我将插入到人员列表中的人员对象的人员的属性。(人有一个项目,具有属性等..)。问题:它将第一个人及其项目插入到列表中,但是当涉及到必须插入的第二个人时,它将第一个人数据更改为与第二个人数据相同的数据,并插入第二个人。所以它总是插入新人,但改变我已经插入的所有旧数据也与新人相同。

private void btnOK_Click(object sender, EventArgs e)
        {
            bool bOK = false;

            if (UC.IsEmpty(txtFirstName) || UC.IsEmpty(txtLastName) || UC.IsEmpty(txtID) || lstItemsAdded.Text == null) //Maak seker van die listItemsAdded se content... hier sal n error wees... j kan nog n else maak dat hy spesefiek toets of daar items in die lstbox is
            {
                UC.MB("Customer Information Missing", "Please supply enough customer information");
            }
            else
            {
                bOK = true;
            }
            if (bOK) 
            {

                foreach (Item item in lstItemsAdded.Items)
                {
                        PersonItemObject.FirstName = txtFirstName.Text;
                        PersonItemObject.LastName = txtLastName.Text;
                        PersonItemObject.ID = txtID.Text;
                        PersonItemObject.Email = txtEmail.Text;
                        PersonItemObject.Age = Convert.ToInt32(txtAge.Text);

                        PersonItemObject.Item.ItemCode = item.ItemCode;
                        PersonItemObject.Item.ItemDescription = item.ItemDescription;
                        PersonItemObject.Item.ItemName = item.ItemName;
                        PersonItemObject.Item.ItemPrice = item.ItemPrice;

它应该将 listBox 中的所有项目添加到下一条语句的列表中,并且对于每个项目,它也应该添加人员详细信息。

                        PersonItemsList.Add(PersonItemObject);

如果我向一个人添加了超过 1 个项目,它会将我添加到列表中的旧数据更改为与新的人员数据相同,并将新的人也插入到列表中。

                    }
                DialogResult = DialogResult.OK;
                Close();

            }
        }

【问题讨论】:

  • PersonItemObject 定义在哪里?
  • 这是因为您每次都添加相同的PersonItemObject 引用,您需要在循环的每次迭代中创建一个新的PersonItemObject

标签: c# sqlite loops foreach listbox


【解决方案1】:

在每次迭代中,您都在更新同一对象的属性,然后将其插入到列表中。最终列表中的 SO 包含对同一对象的多个引用。

你应该做的是为每次迭代创建新对象:

foreach (Item item in lstItemsAdded.Items)
{
    PersonItem item = new PersonItem(); //just guessing the type here
    item.FirstName = txtFirstName.Text;
    ...
    PersonItemsList.Add(item);
}

【讨论】:

    【解决方案2】:

    您应该创建一个“PersonItemObject”的新实例。比如:

    PersonItemObject = new PersonItemObjectClass()
    

    作为循环的第一句话,PersonItemObjectClassPersonItemObject 的类型。这里的问题可能是,您总是使用相同的实例,因此值总是在变化。

    【讨论】:

      【解决方案3】:

      您必须在 foreach 循环内创建一个 PersonItemObject 是任何类型的新实例。

      您添加到PersonItemsList 的内容实际上是对您的类的单个实例的引用。每次迭代循环时,您都会更新同一个实例,因此您有一个外观相同的对象列表。

      foreach (Item item in lstItemsAdded.Items)
      {
          var PersonItemObject = new PersonItem();
      
          PersonItemObject.FirstName = txtFirstName.Text;
          PersonItemObject.LastName = txtLastName.Text;
      
          ...
      
          PersonItemsList.Add(PersonItemObject);
      }
      

      您可能想了解value types and reference types 之间的区别。

      【讨论】:

        【解决方案4】:

        您有一个 PersonItemObject,并且您在每次迭代中都对其进行更改。如果您想创建一个 PersonItemObjects 列表,则在每次迭代时创建一个新实例:

        foreach (Item item in lstItemsAdded.Items)
        {
            var PersonItemObject = new YourType();
            PersonItemObject.FirstName = txtFirstName.Text;
            PersonItemObject.LastName = txtLastName.Text;
            ...
        }
        

        【讨论】:

        • 非常感谢,您的所有答案都有帮助!它现在正在工作
        【解决方案5】:

        发生这种情况是因为您总是更改相同的PersonItemObject。您应该每次都创建此对象的新版本并将其添加到您的列表中。

        foreach (Item item in lstItemsAdded.Items)
        {
            var newObject = new PersonItemObject();
            newObject.FirstName = txtFirstName.Text;
            newObject.LastName = txtLastName.Text;
            newObject.ID = txtID.Text;
            newObject.Email = txtEmail.Text;
            newObject.Age = Convert.ToInt32(txtAge.Text);
        
            newObject.Item.ItemCode = item.ItemCode;
            newObject.Item.ItemDescription = item.ItemDescription;
            newObject.Item.ItemName = item.ItemName;
            newObject.Item.ItemPrice = item.ItemPrice;
        
            PersonItemsList.Add(newObject);
        }
        

        【讨论】:

          【解决方案6】:

          每次为它设置值时,您并不是在创建一个新对象。要创建一个新对象,正确的方法是这样的:

          foreach (Item item in lstItemsAdded.Items)
          {
              var newObject = new PersonItemObject()
              {
                  FirstName = txtFirstName.Text;
                  LastName = txtLastName.Text;
                  ID = txtID.Text;
                  Email = txtEmail.Text;
                  Age = Convert.ToInt32(txtAge.Text);
          
                  Item.ItemCode = item.ItemCode;
                  Item.ItemDescription = item.ItemDescription;
                  Item.ItemName = item.ItemName;
                  Item.ItemPrice = item.ItemPrice;
              }
              PersonItemsList.Add(newObject);
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-05-18
            • 1970-01-01
            • 1970-01-01
            • 2015-03-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多