我在尝试填充GridView时遇到了一个行为,我无法理解。考虑下面的代码:修改其他对象时发生变化的对象的变量
DataTable table = GetStockMovement((int)ViewState[MOVEMENT_ID], false);
MovedProducts = from DataRow row in table.Rows
select new Product()
{
ProductId = (int)row["ProductId"],
ProductNo = row["ProductNo"].ToString(),
Name = row["ProductName"].ToString(),
Quantity = OriginalProducts.ToList().Find(p => p.ProductId == (int)row["ProductId"]).Quantity,
QuantityDiff = (int)row["Change"]
};
foreach (Product product in MovedProducts)
{
Console.WriteLine(product.ProductId + ": " + product.Quantity);
}
Console.WriteLine();
foreach (Product product in OriginalProducts)
{
product.Quantity -= 1000;
}
foreach (Product product in MovedProducts)
{
Console.WriteLine(product.ProductId + ": " + product.Quantity);
}
这样做的输出是这样的:
1: 10
2: 4
1: -990
2: -996
Product.Quantity是int MovedProducts和OriginalProducts是存储在ViewState中IEnumerables。
当我在OriginalProducts中更改时,为什么MovedProducts中的产品发生更改?他们不是存储在不同地方的两个完全不同的对象吗?
如果我而不是使用LINQ表达:
List<FPRSProduct> completedProducts = new List<FPRSProduct>();
foreach (DataRow row in table.Rows)
{
Product tmp = new Product();
tmp.ProductId = (int)row["ProductId"];
tmp.ProductNo = row["ProductNo"].ToString();
tmp.Name = row["ProductName"].ToString();
tmp.Quantity = OriginalProducts.ToList().Find(p => p.ProductId == (int)row["ProductId"]).Quantity;
tmp.QuantityDiff = (int)row["Change"];
completedProducts.Add(tmp);
}
一切工作,因为我预料到,这是我之前和改变OriginalProducts的数量后得到相同的号码。