更新通用列表中元素的最佳方法

假设我们有一个名为Dog的类,它有两个string“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); 
 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"); 

你可以这样做:

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

这将返回匹配的狗,否则将返回null

然后你可以像下面这样设置属性:

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

如果列表被sorting(正如在例子中),索引的二进制search当然有效。

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