2013-10-09 21 views
38

Załóżmy, że mamy klasę o nazwie Dog z dwoma ciągami "Name" i "Id". Załóżmy teraz, że mamy listę zawierającą 4 psy. Jeśli chciałbyś zmienić imię psa z "Id" na "2", jaki byłby najlepszy sposób na zrobienie tego?Najlepszy sposób na aktualizację elementu w ogólnej liście Lista

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

Jest tak wiele sposobów. * Określ najlepiej *? –

+0

@SriramSakthivel Myślałem, że to było pytanie? – TheGeekZn

+0

@SemiDemented Najlepsze znaczenie? Najlepszy w czym? Wydajność? Pamięć? Konserwacja? Zwięzły? albo co? Najlepiej znaczy mało, powinieneś być konkretny. –

Odpowiedz

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

Jednak bezpieczniejsza wersja, że ​​może być to:

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

Jak stwierdzono Reed, możemy po prostu iść prosto do First lub nawet FirstOrDefault tutaj:

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

lub

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

Zauważ, że możesz także zrobić "AllDogs.First (d => d.Id ==" 2 "). Name =' ... –

+0

@ReedCopsey, bardzo ci za to dziękuję. Bardziej zwięzły sposób na osiągnięcie tego! –

+3

To działałoby, jeśli masz jedną właściwość do aktualizacji. Co się stanie, jeśli istnieje wiele właściwości i chcesz zastąpić cały obiekt na liście nowym? – user20358

3

Można zrobić:

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

ten powróci psa dopasowanie, jeszcze powróci null.

Następnie można ustawić właściwość jak następuje:

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

'FirstOrDefault' nie jest tu zbyt użyteczny. Jeśli zwróci "default", spowoduje to 'NullReferenceException' przy próbie ustawienia' Name' ... –

0

Jeżeli lista jest sortowana (jak dzieje się w tym przykładzie) binarny szukaj w indeksie na pewno działa.

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

Nie jestem pewien jaka byłaby wersja LINQ.