我正在尝试将对象类中的项目添加到列表框中,并检查该项目是否已存在于列表框中。如果是这样,那么我只是删除当前项目并将其替换为当前对象(这只会增加数量和价格),但是由于某种原因,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));
}
}
这是因为您要向列表中添加格式化的字符串,但仅与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);
}
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; }
}
这为您提供了查询和项目更新的更多灵活性。希望对您有所帮助。