2013-10-09 47 views
38

假设我们有一个名为Dog的类,其中包含两个字符串“Name”和“Id”。现在假设我们有一个包含4只狗的列表。如果你想用“2”的“ID”改变狗的名字,那么最好的办法是什么?更新通用列表中元素的最佳方法

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”,当你尝试设置Name时会引发一个'NullReferenceException'。 –

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版本。

相关问题