Каков наиболее эффективный способ идентифицировать и заменить объект в ObservableCollection? - PullRequest
4 голосов
/ 30 апреля 2009

У меня есть метод, который получает объект клиента, который изменил свойства, и я хочу сохранить его обратно в основное хранилище данных, заменив старую версию этого объекта.

Кто-нибудь знает правильный способ написания псевдокода на C # для этого ниже?

    public static void Save(Customer customer)
    {
        ObservableCollection<Customer> customers = Customer.GetAll();

        //pseudo code:
        var newCustomers = from c in customers
            where c.Id = customer.Id
            Replace(customer);
    }

1 Ответ

3 голосов
/ 30 апреля 2009

наиболее эффективным будет избегать LINQ; -p

    int count = customers.Count, id = customer.Id;
    for (int i = 0; i < count; i++) {
        if (customers[i].Id == id) {
            customers[i] = customer;
            break;
        }
    }

Если вы хотите использовать LINQ: это не идеально, но будет работать по крайней мере:

    var oldCust = customers.FirstOrDefault(c => c.Id == customer.Id);
    customers[customers.IndexOf(oldCust)] = customer;

Он находит их по ID (используя LINQ), затем использует IndexOf, чтобы получить позицию, и индексатор, чтобы обновить ее. Немного более рискованно, но только одно сканирование:

    int index = customers.TakeWhile(c => c.Id != customer.Id).Count();
    customers[index] = customer;
...