myModelList
是List<MyModel>
对象。 MyModel
由以下元素组成。
我的模型
public bool Name{ get; set; }
public bool Age { get; set; }
public List<School> SchoolsAttended{ get; set; }
所以基本上,我有一个对象列表( myModelList ),其中包含一个对象列表( SchoolsAttended )。
在myModelList
对象中,有SchoolsAttended
的2个元素,在removeSchool
方法中,我要删除代码中所示的第一个元素。到目前为止,一切都按预期进行。
但是,当foreach
循环进行第2次迭代时,SchoolsAttended
对象中只有1个元素。 (这是因为我们在上一次迭代中删除了一个元素)。
我的问题是,尽管从myModelList
中删除了一个对象,我仍需要在main方法中维护removeSchool
的相同副本。
换句话说,它不应更改原始对象myModelList
中的值。
主要方法
foreach(var l in myModelList)
{
removeSchool(l.SchoolsAttended);
}
删除方法
public void removeSchool(List<School> school) {
school.RemoveAt(0);
}
答案 0 :(得分:1)
因为List<School>
是引用类型的实例,当您使用school.RemoveAt(0);
时,它将从school
中删除第一项
如果要保留原始数据,可以尝试使用linq Where
seconde覆盖方法来达到期望。
公共静态IEnumerable Where(此
IEnumerable<TSource>
来源,Func<TSource, bool>
谓词);
第二个参数是您在集合中的索引。
foreach(var l in myModelList)
{
l.SchoolsAttended = l.SchoolsAttended.Where((k, idx) => idx > 0).ToList();
}
答案 1 :(得分:1)
如果要保留原始的myModelList
,可以创建其副本:
var myModelList = /* your data here */
var copy = myModelList.Select(m => new MyModel
{
Name = m.Name,
Age = m.Age,
SchoolsAttended = m.SchoolsAttended.Skip(1).ToList()
}).ToList();
Skip
方法将从SchoolsAttended
中删除第一所学校
答案 2 :(得分:0)
我想知道为什么myModelList
的两个项目都引用同一个List<School>
对象。
我建议您确保所有MyModel
实例都使用不同的列表。
为此,您可以将初始化程序添加到SchoolsAttended
并将属性设置为只读:
public List<School> SchoolsAttended{ get; private set; } = new List<School>();
在创建模型时,您可以调用AddRange
来填充列表,例如:
model.SchoolsAttended.AddRange(otherModel.SchoolsAttended);