我在嘗試填充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的數量後得到相同的號碼。