日期:2014-05-18  浏览次数:20973 次

对象列表之间的复制
public partial class Form1 : Form
  {
  private student s1 = null;
  List<student> listOld = null;
  List<student> listNew = null;
  student[] stu = null;
  public Form1()
  {
  InitializeComponent();
  }
  #region
  /// <summary>
  /// LOAD
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void Form1_Load(object sender, EventArgs e)
  { 
   
  s1 = new student();
  s1.Age = 19;
  s1.Descriptiion = "我可是个好学生啊";
  s1.Name = "吴海华";
  s1.Sex = true;
  listOld = new List<student>();
  listOld.Add(s1);
   
  }
  #endregion

  #region 复制
  /// <summary>
  /// 复制
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnChange_Click(object sender, EventArgs e)
  {
  stu = new student[listOld.Count];
  listOld.CopyTo(stu);
  listNew = stu.ToList<student>();

  //当新的列表改变时,旧的列表的值应该不发生变化,但发生了变化,为什么?
  foreach (student s22 in listNew)
  {
  s22.Name = this.txtChange.Text.Trim();
  }
  }
  #endregion
  }

------解决方案--------------------
因为复制是一个深拷贝,即原来对像的引用也拷贝过来了,所以你可以用Clone

stu = (student[])listOld.Clone();
listNew = stu.ToList <student>(); 

------解决方案--------------------
肯定是这样子,因为列表里存放的是引用,
两种方式解决
一是自己实现列表,控制列表的拷贝

二是把引用对象换为值类型
------解决方案--------------------
引用7楼的:
肯定是这样子,因为列表里存放的是引用, 
两种方式解决 
一是自己实现列表,控制列表的拷贝 

二是把引用对象换为值类型

这个正解,看lz的意图是要将加入listOld中的student对象复制到listNew中;
建议方法:
方法1、将student从class转化为struct类型。
方法2、为student类添加Clone方法使用类似下面的方法进行复制:
foreach(student item in listOld)
{
listNew.Add(item.Clone());
}