修改IList循环中的数据成员会修改IList的其他元素
本文关键字:修改 IList 其他 元素 数据成员 循环 | 更新日期: 2023-09-27 18:26:44
我对这个问题很困惑,甚至不知道如何命名这个问题。
我创建了一个类的IList,然后使用.Add()填充该IList。一旦填充了IList,我需要遍历IList,对一些值进行简单的检查,然后将每个元素的一个数据成员设置为0.00。
问题是,设置一个元素的数据成员也会设置下一个元素相同的数据成员。以下是代码示例:
public class MyClass
{
private int _Id;
private string _ModelName;
private double _Price;
public int Id
{
get { return _Id; }
set { _Id = value; }
}
public string ModelName
{
get { return _ModelName; }
set { _ModelName= value; }
}
public double Price
{
get { return _Price; }
set { _Price = value; }
}
}
我使用MyClass是这样的:
IList<MyClass> MyClasses = new List<MyClass>();
MyClasses.Add( new MyClass { Id = 1, ModelName = "Model1", Price = 119310.05 });
MyClasses.Add( new MyClass { Id = 2, ModelName = "Model1", Price = 119310.05 });
MyClasses.Add( new MyClass { Id = 3, ModelName = "Model1", Price = 119310.05 });
MyClasses.Add( new MyClass { Id = 4, ModelName = "Model1", Price = 119310.05 });
MyClasses.Add( new MyClass { Id = 5, ModelName = "Model2", Price = 19810.32 });
MyClasses.Add( new MyClass { Id = 6, ModelName = "Model2", Price = 19810.32 });
MyClasses.Add( new MyClass { Id = 7, ModelName = "Model2", Price = 19810.32 });
foreach( MyClass myclass in MyClasses )
{
... do something ...
myclass.Price = 0.00;
... do something ...
}
好的,上面的代码是我实际代码的一个非常简单的表示。发生的情况是,当我在foreach
循环中设置myclass.Price = 0.00;
时,所有具有匹配ModelName的Price数据成员也将更改为0.00。因此,在foreach循环中,当我将Id=1的元素设置为Price=0.00时,我立即在IList:中看到了这一点
MyClasses.Add( new MyClass { Id = 1, ModelName = "Model1", Price = 0.00 });
MyClasses.Add( new MyClass { Id = 2, ModelName = "Model1", Price = 0.00 });
MyClasses.Add( new MyClass { Id = 3, ModelName = "Model1", Price = 0.00 });
MyClasses.Add( new MyClass { Id = 4, ModelName = "Model1", Price = 0.00 });
MyClasses.Add( new MyClass { Id = 5, ModelName = "Model2", Price = 19810.32 });
MyClasses.Add( new MyClass { Id = 6, ModelName = "Model2", Price = 19810.32 });
MyClasses.Add( new MyClass { Id = 7, ModelName = "Model2", Price = 19810.32 });
我觉得这是一个完全愚蠢的问题,我最终可能会找到一个同样愚蠢的原因。我已经使用F11进入了所涉及的每一行代码,并且没有看到在其他元素中设置Price的任何地方。就这一点而言,MyClass对于包含在IList中的存在是完全愚蠢的。
这似乎是循环本身造成的。我也用同样的行为尝试过这种方法:
for (int p = 0; p < MyClasses.Count; p++ )
{
... do something ...
myclass[p].Price = 0.00;
... do something ...
}
我添加了一块手表:
MyClasses[p].Price
MyClasses[p + 1].Price
MyClasses[p + 2].Price
MyClasses[p + 3].Price
MyClasses[p + 4].Price
遍历循环显示,当MyClasses[p].Price
设置为0.00时,所有其他元素的Price成员都将设置为0.00。
对于这种行为,除了在我的课堂上有什么原因之外,还有什么可能的解释吗?可能与IList有关?
您的问题最明显的答案是,您实际上是在为每个唯一的ModelName值复制对MyClass的单个实例的相同引用,所以您的列表中只是多次包含相同的实例。但是,如果没有一个适当简洁但完整的代码示例,就不可能确定。