C#LINQ更新项列表<string> </string>

时间:2014-07-30 18:56:50

标签: c# linq

我在使用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,但仍然没有结果。

我做错了什么?

5 个答案:

答案 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"); - 仍然会以同样的方式失败,)