您好我有一个包含产品的自定义BindingList,其中包含以下信息
string ProductID
int Amount;
我怎样才能做到以下几点。
ProductsList.Add(new Product("ID1", 10));
ProductsList.Add(new Product("ID2", 5));
ProductsList.Add(new Product("ID2", 2));
该列表应包含2个产品
ProductID = "ID1" Amount = 10
ProductID = "ID2" Amount = 7;
所以它有点像购物车
我正在查看AddingNew事件并覆盖void InsertItem(int index,T item)
但我真的需要一点帮助才能开始
答案 0 :(得分:1)
我真的不知道为什么你需要这个自定义列表,因为.net库中有很多好的集合,但我已尝试过以下内容。
public class ProductList
{
public string ProductID {get;set;}
public int Amount {get;set;}
}
public class MyBindingList<T>:BindingList<T> where T:ProductList
{
protected override void InsertItem(int index, T item)
{
var tempList = Items.Where(x => x.ProductID == item.ProductID);
if (tempList.Count() > 0)
{
T itemTemp = tempList.FirstOrDefault();
itemTemp.Amount += item.Amount;
}
else
{
if (index > base.Items.Count)
{
base.InsertItem(index-1, item);
}
else
base.InsertItem(index, item);
}
}
public void InsertIntoMyList(int index, T item)
{
InsertItem(index, item);
}
}
并在您可以使用此列表的客户端代码中。
ProductList tempList = new ProductList() { Amount = 10, ProductID = "1" };
ProductList tempList1 = new ProductList() { Amount = 10, ProductID = "1" };
ProductList tempList2 = new ProductList() { Amount = 10, ProductID = "2" };
ProductList tempList3 = new ProductList() { Amount = 10, ProductID = "2" };
MyBindingList<ProductList> mylist = new MyBindingList<ProductList>();
mylist.InsertIntoMyList(0, tempList);
mylist.InsertIntoMyList(1, tempList1);
mylist.InsertIntoMyList(2, tempList2);
mylist.InsertIntoMyList(3, tempList);
mylist.InsertIntoMyList(4, tempList1);
mylist.InsertIntoMyList(0, tempList3);
答案 1 :(得分:1)
创建自己的集合很少是正确的选择 - 在这种情况下,我倾向于包含而不是继承。像
这样的东西class ProductsList
{
private readonly SortedDictionary<string, int> _products
= new Dictionary<string,int>();
public void AddProduct(Product product)
{
int currentAmount;
_products.TryGetValue(product.ProductId, out currentAmount);
//if the product wasn't found, currentAmount will be 0
_products[product.ProductId] = currentAmount + product.Amount;
}
}
评论:
IEnumerable<Product>
的扩展方法,而不是创建自己的类(强制您实现所需的所有方法),而不是AddProduct
- 但这不会隐藏常规Add
方法,我认为这更像是一种快速而肮脏的方式最后,不要担心IBindingList
部分 - 您始终可以使用BindingSource