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

Joh*_* H. 45 c# generic-list

假设我们有一个叫做Dog的类,它有两个字符串"Name"和"Id".现在假设我们有一张包含4只狗的清单.如果您想更改"Id"为"2"的Dog的名称,那么最好的方法是什么?

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);
Run Code Online (Sandbox Code Playgroud)

Mik*_*oud 86

AllDogs.First(d => d.Id == "2").Name = "some value";
Run Code Online (Sandbox Code Playgroud)

但是,更安全的版本可能是这样的:

var dog = AllDogs.FirstOrDefault(d => d.Id == "2");
if (dog != null) { dog.Name = "some value"; }
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您也可以执行`AllDogs.First(d => d.Id =="2").Name =`... (12认同)
  • 如果您有一个要更新的属性,这将有效.如果有许多属性并且您想要用新的对象替换列表中的整个对象,该怎么办? (4认同)

gle*_*eng 6

你可以这样做:

var matchingDog = AllDogs.FirstOrDefault(dog => dog.Id == "2"));
Run Code Online (Sandbox Code Playgroud)

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

然后,您可以设置如下属性:

if (matchingDog != null)
    matchingDog.Name = "New Dog Name";
Run Code Online (Sandbox Code Playgroud)

  • `FirstOrDefault`在这里并没有用.如果它返回"default",当你尝试设置`Name`时它会引发一个`NullReferenceException` ... (6认同)
  • 这意味着它在这里确实很有用,因为如果你只使用 .first,你会在执行选择本身时遇到异常。 (2认同)