C#LINQ更新项列表<string>

Rob*_* J. 3 c# linq

我有更新单个项目的问题,List<string>使用LINQ匹配不同的字符串.假设我有一个名单列表,我想检查名单"John"是否已存在于我的列表中.如果是,则将"John"替换为"Anna".

这是我做的:

var sItem = myList.First(n=> n == "John"); //I am 100% sure that John exists, that\s why I use .First
sItem = "Anna";
Run Code Online (Sandbox Code Playgroud)

这是它应该如何工作,但当我在进程后检查我的List(myList)时,原始项目仍然存在(我仍然可以看到John,而不是Anna).我也尝试在List上实现INotifyChanged,但仍然没有结果.

我究竟做错了什么?

Lee*_*Lee 15

如果您需要更新,请使用FindIndex:

int index = myList.FindIndex(n => n == "John");
myList[index] = "Anna";
Run Code Online (Sandbox Code Playgroud)


Adi*_*dil 6

您正在将 linq 查询的结果分配给字符串变量。这不是列表的元素,而是一个也引用该列表的元素的变量。更改变量的值sItem将定义一个新字符串,该字符串将被 引用sItem,并且列表中的项目保持不变。

您可以使用FindIndex获取数组中元素的索引并使用它来引用列表元素。

int index = myList.FindIndex(n => n == "John");
myList[index] = "Anna";
Run Code Online (Sandbox Code Playgroud)

搜索与指定谓词定义的条件匹配的元素,并返回整个 List 中第一个匹配项的从零开始的索引。

编辑

当一个字符串变量被分配给另一个字符串变量时。它们都引用相同的字符串,但是当您将不同的字符串分配给第二个变量时,它们都引用不同的字符串。请参阅 Eric Lippert 的回答中的以下示例。

a----------------------Hello
Run Code Online (Sandbox Code Playgroud)

然后你说“b = a”,这意味着将另一段字符串附加到a附加到的同一事物上:

a----------------------Hello
                      /
b---------------------
Run Code Online (Sandbox Code Playgroud)

然后你说“现在将 b 附加到 Hi”

a----------------------Hello

b----------------------Hi
Run Code Online (Sandbox Code Playgroud)