2009-04-30 8 views
4

J'ai une méthode qui reçoit un objet client qui a changé de propriétés et je veux le sauvegarder dans le magasin de données principal en remplaçant l'ancienne version de cet objet. Est-ce que quelqu'un connaît le moyen correct d'écrire le pseudo code C# pour faire ceci ci-dessous?Quel est le moyen le plus efficace d'identifier et de remplacer un objet dans une ObservableCollection?

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); 
    } 
+0

Merci d'avoir posé cette question. J'ai demandé quelque chose de similaire plus tôt cette semaine (http://stackoverflow.com/questions/800091/how-do-i-update-an-existing-element-of-an-observablecollection) mais pas aussi bien que vous venez de le faire. –

Répondre

3

Le le plus efficace serait d'éviter 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; 
     } 
    } 

Si vous souhaitez utiliser LINQ: ce n'est pas idéal, mais travaillerait au moins:

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

Il les trouve par ID (en utilisant LINQ), puis utilise IndexOf pour obtenir la position, et l'indexeur pour la mettre à jour. Un peu plus risqué, mais un seul balayage:

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

J'ai utilisé votre deuxième version et cela a fonctionné, excellent, merci. –

Questions connexes