2013-10-09 10 views
38

Angenommen, wir haben eine Klasse namens Dog mit zwei Strings "Name" und "Id". Nehmen wir an, wir haben eine Liste mit 4 Hunden. Wenn Sie den Namen des Hundes mit der "Id" von "2" ändern möchten, was wäre der beste Weg, dies zu tun?Die beste Methode, um ein Element in einer generischen Liste zu aktualisieren

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

Es gibt so viele Möglichkeiten. * Definieren Sie am besten *? –

+0

@SriramSakthivel Ich dachte, das war die Frage? – TheGeekZn

+0

@SemiDemented Beste Bedeutung? Am besten in was? Performance? Erinnerung? Instandhaltung? Prägnant? oder was? Gut bedeutet wenig, du solltest spezifisch sein. –

Antwort

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

jedoch eine sicherere Version davon könnte sein:

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

Als Reed erwähnt, können wir nur gerade zu First gehen oder sogar FirstOrDefault hier:

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

oder

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

Beachten Sie, dass Sie auch 'AllDogs.First (d => d.Id ==" 2 ") tun können. Name =' ... –

+0

@ReedCopsey, vielen Dank dafür. Eine prägnantere Art, darauf zu kommen! –

+3

Dies funktioniert, wenn Sie eine Eigenschaft zum Aktualisieren haben. Was ist, wenn es viele Eigenschaften gibt und Sie das gesamte Objekt in der Liste durch ein neues ersetzen möchten? – user20358

3

könnten Sie tun:

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

Dies wird den passenden Hund zurückkehren, sonst wird es null zurück.

Anschließend können Sie die Eigenschaft wie folgt:

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

'FirstOrDefault' ist hier nicht wirklich nützlich. Wenn es "default" zurückgibt, wird eine "NullReferenceException" ausgelöst, wenn Sie versuchen, 'Name' zu ​​setzen ... –

0

Wenn die Liste sortiert ist (wie im Beispiel sein geschieht) eine binäre Suche auf Index funktioniert sicher.

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

Nicht sicher, was die LINQ-Version von diesem wäre.

Verwandte Themen