【发布时间】:2016-11-28 03:29:37
【问题描述】:
我有一个简单的课程:
private class ColumnAndValue
{
private string columnName;
private string columnValue;
public string ColumnName
{
get { return columnName; }
set { columnName = value.Trim(); }
}
public string ColumnValue
{
get { return columnValue; }
set { columnValue = value.Trim(); }
}
}
以及该类的列表:
private List<ColumnAndValue> cvList = new List<ColumnAndValue>();
这就是我的问题所在,当我尝试加载列表时,我的值都一样。这是我加载它的方式:
public void TestList()
{
ColumnAndValue cv = new ColumnAndValue();
cv.ColumnName = "Column 1";
cv.ColumnValue = "Value 1";
cvList.Add(cv);
cv.ColumnName = "Column 2";
cv.ColumnValue = "Value 2";
cvList.Add(cv);
cv.ColumnName = "Column 3";
cv.ColumnValue = "Value 3";
cvList.Add(cv);
cv.ColumnName = "Column 4";
cv.ColumnValue = "Value 4";
cvList.Add(cv);
List<string> c1 = new List<string>();
c1 = cvList.Select(c => c.ColumnName).ToList();
foreach (object obj in c1)
{
Console.WriteLine(obj.ToString());
}
}
当我运行这段代码时,我得到了四次迭代:
Column 4
Column 4
Column 4
Column 4
当我在调试时进入每个 cvList.Add 时,第一次迭代显示 cvList 具有正确的信息,第二个两个值都有第 2 列......所以,我这样尝试:
ColumnAndValue cv1 = new ColumnAndValue();
ColumnAndValue cv2 = new ColumnAndValue();
ColumnAndValue cv3 = new ColumnAndValue();
ColumnAndValue cv4 = new ColumnAndValue();
cv1.ColumnName = "Column 1";
cv1.ColumnValue = "Value 1";
cvList.Add(cv1);
cv2.ColumnName = "Column 2";
cv2.ColumnValue = "Value 2";
cvList.Add(cv2);
cv3.ColumnName = "Column 3";
cv3.ColumnValue = "Value 3";
cvList.Add(cv3);
cv4.ColumnName = "Column 4";
cv4.ColumnValue = "Value 4";
cvList.Add(cv4);
一切都按预期进行:
Column 1
Column 2
Column 3
Column 4
我的问题是,如何在仅使用一个 cv 实例的情况下填写列表?
【问题讨论】:
-
List<T>.Add(T item)不会将item的副本 添加到列表中,而是添加一个引用。 4 个列表项都指向同一个原始对象(您同时更新了) -
你需要重新实例化第一组代码中的对象,否则你只是重新添加相同的项目4次。