[英]Removing items from a List without losing original reference - logic issue
myModelList
是一個List<MyModel>
對象。 MyModel
包含以下元素。
我的模型
public bool Name{ get; set; }
public bool Age { get; set; }
public List<School> SchoolsAttended{ get; set; }
因此,基本上,我有一個對象列表( myModelList ),其中包含一個對象列表( SchoolsAttended )。
在myModelList
對象中,有2個SchoolsAttended
元素,在removeSchool
方法中,我正在刪除代碼中所示的第一個元素。 到目前為止,一切正常。
但是,當foreach
循環經過其第二次迭代時, SchoolsAttended
對象中僅包含1個元素。 (這是因為我們在上一次迭代中刪除了一個元素)。
我的問題是,盡管從removeSchool
刪除了一個對象,但我仍需要在main方法中維護myModelList
的相同副本。
換句話說,它不應更改原始對象myModelList
。
主要方法
foreach(var l in myModelList)
{
removeSchool(l.SchoolsAttended);
}
刪除方法
public void removeSchool(List<School> school) {
school.RemoveAt(0);
}
因為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();
}
如果要保留原始的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
我想知道為什么myModelList
兩個項目myModelList
引用相同的List<School>
對象。 我建議您確保所有MyModel
實例都使用不同的列表。 為此,您可以向SchoolsAttended
添加一個初始化SchoolsAttended
,並使該屬性為只讀:
public List<School> SchoolsAttended{ get; private set; } = new List<School>();
創建模型時,可以調用AddRange
來填充列表,例如:
model.SchoolsAttended.AddRange(otherModel.SchoolsAttended);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.