Вставить только если новое обновление еще в BindingList - PullRequest
0 голосов
/ 17 ноября 2010

Привет! У меня есть пользовательский 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)

Но ядействительно может понадобиться небольшая помощь для начала работы

Ответы [ 2 ]

1 голос
/ 17 ноября 2010

Создание собственной коллекции редко является правильным выбором - я бы предпочел сдерживание, а не наследование в этом случае. Что-то вроде

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 (в отличие от словаря), используйте KeyedCollection
  • Вместо создания собственного класса (который заставляет вас реализовывать все методы, которые вы хотите), вы можете написать метод расширения для IEnumerable<Product>, что-то вроде AddProduct - но это не скроет обычный Add метод, я думаю, это более быстрый и грязный способ сделать это

Наконец, не беспокойтесь о части IBindingList - вы всегда можете использовать BindingSource

1 голос
/ 17 ноября 2010

Я действительно не знаю, зачем вам этот пользовательский список, так как в библиотеке .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);
...