2013-10-09 2 views
38

Supposons que nous ayons une classe appelée Dog avec deux chaînes "Name" et "Id". Supposons maintenant que nous avons une liste de 4 chiens. Si vous vouliez changer le nom du chien avec le "Id" de "2", quelle serait la meilleure façon de le faire?Meilleure façon de mettre à jour un élément dans une liste générique

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

Il y a tellement de façons. * Définir le meilleur *? –

+0

@SriramSakthivel Je pensais que c'était la question? – TheGeekZn

+0

@SemiDemented Le meilleur sens? Meilleur dans quoi? Performance? Mémoire? Entretien? Concis? ou quoi? Le meilleur signifie peu, vous devriez être spécifique. –

Répondre

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

Cependant, une version plus sûre de ce pourrait être le suivant:

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

Comme Reed a déclaré, nous pouvons juste aller directement à First ou même FirstOrDefault ici:

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

ou

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

Notez que vous pouvez également faire 'AllDogs.First (d => d.Id ==" 2 "). Name =' ... –

+0

@ReedCopsey, merci beaucoup pour cela. Une façon plus concise d'y arriver! –

+3

Cela fonctionnerait si vous avez une propriété à mettre à jour. Que faire s'il y a beaucoup de propriétés et que vous voulez remplacer l'objet entier dans la liste par un nouveau? – user20358

3

Vous pouvez faire:

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

Cela renverra le chien correspondant, sinon il retournera null.

Vous pouvez alors définir la propriété comme suit:

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

'FirstOrDefault' n'est pas vraiment utile ici. Si elle renvoie "default", cela déclenchera un 'NullReferenceException' quand vous essayerez de mettre' Name' ... –

0

Si la liste est triée (comme il arrive à être dans l'exemple) une recherche binaire sur l'index fonctionne certainement.

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; 
     } 
    } 

Vous ne savez pas quelle serait la version de LINQ.

Questions connexes