我在使用LINQ更新List<string>
下与不同字符串匹配的单个项目时遇到问题。让我们说我有一个名单列表,我想查看姓名&#34; John&#34;已存在于我的列表中。如果是,那么替换&#34; John&#34;和#34; Anna&#34;。
以下是我的工作:
var sItem = myList.First(n=> n == "John"); //I am 100% sure that John exists, that\s why I use .First
sItem = "Anna";
这是它应该如何工作,但当我在进程后检查我的List(myList)时,原始项目仍然存在(我仍然可以看到John,而不是Anna)。我也尝试在List上实现INotifyChanged,但仍然没有结果。
我做错了什么?
答案 0 :(得分:15)
如果您需要更新,请使用FindIndex
:
int index = myList.FindIndex(n => n == "John");
myList[index] = "Anna";
答案 1 :(得分:4)
您正在将linq查询的结果分配给字符串变量。这不是列表的元素,而是一个也引用该列表元素的变量。更改变量sItem
的值将定义将由sItem
引用的新字符串,并且列表中的项目保持不变。
您可以使用FindIndex获取数组中元素的索引,并使用它来引用list元素。
int index = myList.FindIndex(n => n == "John");
myList[index] = "Anna";
搜索符合条件定义的条件的元素 指定谓词,并返回第一个从零开始的索引 在整个清单中出现。
修改强>
将一个字符串变量分配给其他字符串变量时。它们都将引用相同的字符串,但是当您为第二个变量分配不同的字符串时,它们都引用不同的字符串。请参阅Eric Lippert的answer中的以下示例。
a----------------------Hello
然后你说&#34; b = a&#34;,这意味着将另一段字符串附加到a
附加到的同一个字段:
a----------------------Hello
/
b---------------------
然后你说&#34;现在将b附加到Hi&#34;
a----------------------Hello
b----------------------Hi
答案 2 :(得分:0)
它应该适合你
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");
}
答案 3 :(得分:0)
int sItem = myList.FindIndex(x => x == "John");
myList[sItem] = "Anna";
答案 4 :(得分:-1)
您看到的问题是System.String
,实际上是引用类型,就像值类型一样。因此,当您为sItem
分配新值时,您正在替换它,而不是更改它。
如果您使用的是真正的引用类型,那么您尝试的方法可能有效:
List<Person> myList = ....;
var sItem = myList.First(p=> p.Name == "John");
sItem.Name = "Anna";
(分配 - sItem = new Person("Anna");
- 仍然会以同样的方式失败,)