簡體   English   中英

從列表中刪除項目而不丟失原始參考-邏輯問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM