我試圖從IEnumerable<ImportDataMappingModel> GridList
從IEnumerable的<T>刪除項目不工作
我用下面的選項嘗試,但他們的非工作刪除對象。
value
是ImportDataMappingModel
屬性
GridList.ToList().RemoveAll(o => o.value==null);
GridList=GridList.TakeWhile(o => o.value!=null);
我試圖從IEnumerable<ImportDataMappingModel> GridList
從IEnumerable的<T>刪除項目不工作
我用下面的選項嘗試,但他們的非工作刪除對象。
value
是ImportDataMappingModel
屬性
GridList.ToList().RemoveAll(o => o.value==null);
GridList=GridList.TakeWhile(o => o.value!=null);
ToList返回您GridList的副本,要修改它,而不是原來的GridList
不能從IEnumerable<T>
Remove
項目,因爲它是不意味着可以修改。
嘗試使用ICollection<T>
試試這個:
GridList = GridList.Where(o => o.value != null).ToList();
你的第一次嘗試,GridList.ToList().RemoveAll(o => o.value==null)
,創建列表(ToList()
調用)的副本,然後修改該副本,保持原始列表不變。
您的第二次嘗試GridList=GridList.TakeWhile(o => o.value!=null)
創建一個枚舉,枚舉時枚舉將返回第一個空項(如果有)之前的所有非null項。但它實際上並沒有枚舉新的枚舉,所以你從來沒有真正創建這個新的集合。
要糾正的第二次嘗試,你需要做兩件事情:
更換TakeWhile用在哪裏。例如,如果您有一個包含三個條目的列表,其中第一個和第三個不爲空,而第二個爲空,則TakeWhile將僅返回第一個條目。如果你想要所有非null項目,你需要使用Where代替。
Call ToList()將由Where枚舉器選擇的項目複製到新列表中。
@ psubsee2003所有其他的答案解釋哪裏不對。但是,他們都沒有提出OP似乎需要的解決方案。 – phoog
@ psubsee2003完成。 – phoog
現在你有我的+1 – psubsee2003
這不起作用,因爲它正在處理副本,並且該副本未分配給任何內容。
GridList.ToList().RemoveAll(o => o.value==null);
的修復將是:
var list = GridList.ToList(); //create copy
list.RemoveAll(o => o.value==null); //work on copy
GridList = list; //assign copy to gridlist
這TakeWhile
版本不工作,因爲它會停止服用時o.value==null
(請注意,它會在工作的情況下,你不想要的一切是上月底):
GridList = GridList.TakeWhile(o => o.value!=null);
的解決將是使用其中:
GridList = GridList.Where(o => o.value!=null);
結束意味着如果我有10個項目,那麼所有的空項目應該在最後。 – Vallabha
我在說TakeWhile會出現工作,如果最後的項目是'o.value == null' – weston
也許惰性執行的LINQ查詢是第二個查詢的問題的責任? – psubsee2003
GridList.ToList().RemoveAll(o => o.value==null));
此代碼不會做你想做的,因爲要在通話「.ToList()」創建列表<的新實例>,從GridList不同。所以這段代碼實際上會從新的列表實例中刪除所有的空值項目,而不是從'GridList'中刪除。
GridList = GridList.TakeWhile(o => o.value!=null);
該代碼會怎麼做你所期望的,但由於LINQ的命令執行不同,簡單的調用TakeWhile()不會立即執行,但只有在你嘗試讀取GridList的項目。如果要強制執行,你應該叫「.ToList()」或「.ToArray()」的結尾,即:
GridList = GridList.TakeWhile(o => o.value!=null).ToList();
請介紹‘不工作’ –