防止将对象类的重复条目作为项目添加到列表框

问题描述 投票:0回答:2

我正在尝试将对象类中的项目添加到列表框中,并检查该项目是否已存在于列表框中。如果是这样,那么我只是删除当前项目并将其替换为当前对象(这只会增加数量和价格),但是由于某种原因,if语句始终如真,因此我正在检查项目名称是否已经存在并且是否总是提出它的not(即使它是)。

这是我在下面的尝试:

 private void AddListItem(OrderItem item)
 {
     if (!lstOrderPad.Items.Contains(item.Name))
     {
         lstOrderPad.Items.Add(string.Format("{0,-5}{1,-15}{2,-10}",
             item.Quantity, item.Name, item.ItemPrice));
     }
     else
     {
         int index = lstOrderPad.Items.IndexOf(item);
         lstOrderPad.Items.RemoveAt(index);
         lstOrderPad.Items.Add(string.Format("{0,-5}{1,-15}{2,-10}",
             item.Quantity, item.Name, item.ItemPrice));
     }
}
c# listbox duplicates
2个回答
0
投票

这是因为您要向列表中添加格式化的字符串,但仅与Name属性进行比较。

您正在将以下字符串添加到列表中

string.Format("{0,-5}{1,-15}{2,-10}", item.Quantity, item.Name, item.ItemPrice)

但与之相比

if (lstOrderPad.Items.Contains(item.Name))

您应该选择以下内容

var itemFormat = string.Format("{0,-5}{1,-15}{2,-10}", item.Quantity, item.Name, item.ItemPrice);
if (!lstOrderPad.Items.Contains(itemFormat))
{
    lstOrderPad.Items.Add(itemFormat);
}

0
投票
if (!lstOrderPad.Items.Contains(item.Name))

如果没有任何项目/字符串包含确切的item.Name,则始终为true。您的每一项都是“ {x,y},{a,b}” ...从不只是“ x”。

如果将查询更改为以下内容,则将检查项目列表中的每个项目,以查看名称是否属于其中。

var itemWithSameName = lstOrderPad.Items.Where(x = x.Contains(item.Name)).FirstOrDefault();

现在您可以检查itemWithSameName是否为null或不替换它。但是,您将每个元素存储为字符串。不确定如何计划确定字符串的哪一部分是要更新的数量。您绝对应该研究可以帮助您存储这些值的类。

类似...

public class Order
{
    public Order ()
    {
        Items = new List<Item>();
    }

    public List<Item> Items { get; set; }
}

public class Item
{
    public string Name { get; set; }
    public int Quantity { get; set; }
    public int Price { get; set; }
}

这为您提供了查询和项目更新的更多灵活性。希望对您有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.