如何使用直接实例分配替换列表项

时间:2013-03-12 05:46:05

标签: c# list

我有以下代码,我正在尝试3种方法(案例)来更新C#列表中的第一项(注意:Dump()是LINQPad IDE中的辅助输出方法)。对于案例2在案例3中没有成功更新列表的原因,我将不胜感激。 first和list [0]都是对列表中第一项的引用,并且在分配直接引用时应该等效。显然不是......

void Main()
{
Person first =  null;
List<Person> list = CreateList(out first);

//Case 1
//This updates the list
first.fname = "Third"; 
list.Dump(); //outputs third, second


//Case 2
//This does not update the list
list = CreateList(out first);
first= new Person() { fname="Third"}; 
list.Dump(); //outputs first, second


//Case 3
//This updates the list
list = CreateList(out first);
list[0] = new Person() { fname="Third"}; 
list.Dump(); //outputs third, second

}

List<Person> CreateList(out Person first)
{
  var list = new List<Person>
  {
  new Person() { fname="First", lname = ""},
  new Person() { fname="Second", lname = ""}
  };
  first = list.Find( x => x.fname == "First");
  return list;
}

// Define other methods and classes here
class Person
{
  public string fname;
  public string lname;
}

2 个答案:

答案 0 :(得分:0)

第二种情况不起作用,因为您使用以下代码将first的引用更改为新对象:

first= new Person() { fname="Third"};

此代码运行后,first不会再次引用列表对象。

尝试将此用于第二种情况:

list = CreateList(out first);
if(first != null)
   first.fname="Third";
list.Dump();

这将设置first的属性,而first仍然会引用列表项。

答案 1 :(得分:0)

将新对象传递给引用对象

first= new Person() { fname="Third"};

使用新的哈希码生成一个新对象,在该哈希码上集合中标识该对象。该列表未找到先前的hascode,因此列表未更新.//case 2

但在案例3中,您正在替换对象的实例,从而列出更新新哈希

在案例1中,您只修改对象的属性并且哈希保持不变

可能是您的问题的解释