Я столкнулся с поведением, которое я не могу понять, когда пытаюсь заполнить 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 является ИНТ Н. MovedProducts и OriginalProducts являются IEnumerables, которые хранятся в ViewState.
Почему продукт в MovedProducts изменяется при изменении в OriginalProducts? Разве это не два совершенно разных объекта, хранящихся в разных местах в памяти?
Если я вместо 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.