2013-10-09 17 views
38

Supponiamo di avere una classe chiamata Cane con due stringhe "Nome" e "Id". Supponiamo ora di avere una lista con 4 cani. Se volessi cambiare il nome del cane con "Id" di "2" quale sarebbe il modo migliore per farlo?Il modo migliore per aggiornare un elemento in un Elenco generico

Dog d1 = new Dog("Fluffy", "1"); 
Dog d2 = new Dog("Rex", "2"); 
Dog d3 = new Dog("Luna", "3"); 
Dog d4 = new Dog("Willie", "4"); 

List<Dog> AllDogs = new List<Dog>() 
AllDogs.Add(d1); 
AllDogs.Add(d2); 
AllDogs.Add(d3); 
AllDogs.Add(d4); 
+0

Ci sono tanti modi. * Definisci il migliore *? –

+0

@SriramSakthivel Ho pensato che fosse questa la domanda? – TheGeekZn

+0

@SemiDemented Il miglior significato? Il migliore in cosa? Prestazione? Memoria? Manutenzione? Conciso? o cosa? Il meglio significa poco, dovresti essere specifico. –

risposta

74
AllDogs.Where(d => d.Id == "2").First().Name = "some value"; 

Tuttavia, una versione più sicura di che potrebbe essere questo:

var dog = AllDogs.Where(d => d.Id == "2").FirstOrDefault(); 
if (dog != null) { dog.Name = "some value"; } 

Come detto Reed, possiamo solo andare dritto al First o addirittura FirstOrDefault qui:

AllDogs.First(d => d.Id == "2").Name = "some value"; 

o

var dog = AllDogs.FirstOrDefault(d => d.Id == "2"); 
+11

Nota che puoi anche solo fare 'AllDogs.First (d => d.Id ==" 2 "). Nome =' ... –

+0

@ReedCopsey, grazie mille per questo. Un modo più conciso per arrivarci! –

+3

Funzionerebbe se si ha una proprietà da aggiornare. Cosa succede se ci sono molte proprietà e si desidera sostituire l'intero oggetto nell'elenco con uno nuovo? – user20358

3

si potrebbe fare:

var matchingDog = AllDogs.FirstOrDefault(dog => dog.Id == "2")); 

Ciò restituirà il cane di corrispondenza, altrimenti tornerà null.

È possibile quindi impostare la proprietà come segue:

if (matchingDog != null) 
    matchingDog.Name = "New Dog Name"; 
+6

'FirstOrDefault' non è molto utile qui. Se restituisce "default", genererà un 'NullReferenceException' quando proverai ad impostare' Name' ... –

0

Se la lista è ordinata (come accade di essere l'esempio) una ricerca binaria sull'indice funziona sicuramente.

public static Dog Find(List<Dog> AllDogs, string Id) 
    { 
     int p = 0; 
     int n = AllDogs.Count; 
     while (true) 
     { 
      int m = (n + p)/2; 
      Dog d = AllDogs[m]; 
      int r = string.Compare(Id, d.Id); 
      if (r == 0) 
       return d; 
      if (m == p) 
       return null; 
      if (r < 0) 
       n = m; 
      if (r > 0) 
       p = m; 
     } 
    } 

Non so quale sarebbe la versione LINQ di questo.

Problemi correlati