从列表中删除项目而不丢失原始参考-逻辑问题

时间:2018-10-21 05:44:37

标签: c#

myModelListList<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);
}

3 个答案:

答案 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);