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,但仍然没有结果。
我做错了什么?
如果需要更新,请使用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");
——仍然会以同样的方式失败,(