qual é a maneira mais eficiente para identificar e substituir um objeto dentro de uma ObservableCollection?
-
03-07-2019 - |
Pergunta
Eu tenho um método que recebe um objeto cliente que mudou propriedades e quero salvá-lo de volta para o armazenamento de dados principal, substituindo a versão antiga do objeto.
Alguém sabe o C # forma correta de escrever o código pseudo para fazer isso abaixo?
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);
}
Solução
O mais eficiente seria evitar 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;
}
}
Se você quiser usar LINQ: este não é o ideal, mas iria funcionar, pelo menos:
var oldCust = customers.FirstOrDefault(c => c.Id == customer.Id);
customers[customers.IndexOf(oldCust)] = customer;
Ele encontra-los por ID (usando LINQ), em seguida, utiliza IndexOf
para obter a posição, e o indexador para atualizá-lo. Um pouco mais arriscado, mas apenas uma varredura:
int index = customers.TakeWhile(c => c.Id != customer.Id).Count();
customers[index] = customer;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow