C#LINQ更新项目列表<;字符串>;

本文关键字:字符串 gt 更新 lt 列表 C#LINQ 新项目 | 更新日期: 2023-09-27 18:15:47

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

我是这样做的:

var sItem = myList.First(n=> n == "John"); //I am 100% sure that John exists, that's why I use .First
sItem = "Anna";

这就是它的工作方式,但当我在流程结束后检查我的列表(myList(时,原始项目仍然存在(我仍然可以看到John,而不是Anna(。我还尝试在List上实现INotifyChanged,但仍然没有结果。

我做错了什么?

C#LINQ更新项目列表<;字符串>;

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

int index = myList.FindIndex(n => n == "John");
myList[index] = "Anna";

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

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

int index = myList.FindIndex(n => n == "John");
myList[index] = "Anna";

搜索与指定的谓词,并返回第一个谓词的从零开始的索引出现在整个列表中。

编辑

当一个字符串变量被分配给另一个时。它们都引用同一个字符串,但当您为第二个变量分配不同的字符串时,例如,它们都引用不同的字符串。下面的例子来自埃里克·利珀特的回答。

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

然后你说"b=a",这意味着将另一段字符串附加到a所附加的东西上

a----------------------Hello
                      /
b---------------------

然后你说"现在把b连接到嗨">

a----------------------Hello
b----------------------Hi
int index = strList.FindIndex(n => n == "John");
if (index != -1)
{
    strList[index] = "Anna";
}

这将确保如果";约翰;列表中不存在,程序不会崩溃。

它应该适用于

List<string> list = new List<string>(); 
list.Add("Gandarez");
list.Add("Carlos");
var search = list.FirstOrDefault(l => l == "Carlos");
if (search != null)
{
    var index = list.IndexOf("Carlos");
    list.RemoveAt(index);
    list.Insert(index, "Test");
}
int sItem = myList.FindIndex(x => x == "John");
myList[sItem] = "Anna";

您看到的问题是,System.String虽然实际上是一个引用类型,但其作用类似于值类型。因此,当你给sItem分配一个新值时,你是在替换它,而不是改变它

如果你使用的是真正的参考类型,你尝试的可能会奏效:

List<Person> myList = ....;
var sItem = myList.First(p=> p.Name == "John");
sItem.Name = "Anna";

(分配——sItem = new Person("Anna");——仍然会以同样的方式失败,(