2013-10-09 4 views
38

Предположим, что у нас есть класс Dog с двумя строками «Имя» и «Ид». Теперь предположим, что у нас есть список с 4 собаками. Если вы хотите изменить имя собаки с «Id» из «2», что было бы лучшим способом сделать это?Лучший способ обновления элемента в общем списке

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

Существует так много способов. * Определить лучший *? –

+0

@SriramSakthivel Я думал, что это был вопрос? – TheGeekZn

+0

@SemiDemented Лучший смысл? Лучше всего в чем? Представление? Память? Обслуживание? Сжатый? или что? Лучше всего мало, вы должны быть конкретными. –

ответ

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

Однако более безопасная версия, которая может быть таким:

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

Как заявил Рид, мы можем просто пойти прямо к First или даже FirstOrDefault здесь:

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

или

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

Обратите внимание, что вы также можете просто 'AllDogs.First (d => d.Id ==" 2 "). Name =' ... –

+0

@ReedCopsey, большое вам спасибо. Более сжатый способ добраться до него! –

+3

Это будет работать, если у вас есть одно свойство для обновления. Что делать, если есть много свойств, и вы хотите заменить весь объект в списке на новый? – user20358

3

Вы можете сделать:

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

Это вернет соответствующий собаку, иначе она будет возвращать null.

Вы можете установить свойство, как следует:

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

'FirstOrDefault' здесь не очень полезен. Если он вернет «default», он поднимет «NullReferenceException», когда вы попытаетесь установить «Name» ... –

0

Если список отсортирован (как случается в примере) двоичный поиск по индексу, безусловно, работает.

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

Не уверен, что такое версия LINQ.