2015-05-27 43 views
0

我試圖從IEnumerable<ImportDataMappingModel> GridList從IEnumerable的<T>刪除項目不工作

我用下面的選項嘗試,但他們的非工作刪除對象。

valueImportDataMappingModel屬性

GridList.ToList().RemoveAll(o => o.value==null); 
GridList=GridList.TakeWhile(o => o.value!=null); 
+0

請介紹‘不工作’ –

回答

4

ToList返回您GridList的副本,要修改它,而不是原來的GridList

2

不能從IEnumerable<T>Remove項目,因爲它是不意味着可以修改。

嘗試使用ICollection<T>

6

試試這個:

GridList = GridList.Where(o => o.value != null).ToList(); 

你的第一次嘗試,GridList.ToList().RemoveAll(o => o.value==null),創建列表(ToList()調用)的副本,然後修改該副本,保持原始列表不變。

您的第二次嘗試GridList=GridList.TakeWhile(o => o.value!=null)創建一個枚舉,枚舉時枚舉將返回第一個空項(如果有)之前的所有非null項。但它實際上並沒有枚舉新的枚舉,所以你從來沒有真正創建這個新的集合。

要糾正的第二次嘗試,你需要做兩件事情:

  1. 更換TakeWhile用在哪裏。例如,如果您有一個包含三個條目的列表,其中第一個和第三個不爲空,而第二個爲空,則TakeWhile將僅返回第一個條目。如果你想要所有非null項目,你需要使用Where代替。

  2. Call ToList()將由Where枚舉器選擇的項目複製到新列表中。

+0

@ psubsee2003所有其他的答案解釋哪裏不對。但是,他們都沒有提出OP似乎需要的解決方案。 – phoog

+0

@ psubsee2003完成。 – phoog

+0

現在你有我的+1 – psubsee2003

4

這不起作用,因爲它正在處理副本,並且該副本未分配給任何內容。

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); 
+0

結束意味着如果我有10個項目,那麼所有的空項目應該在最後。 – Vallabha

+0

我在說TakeWhile會出現工作,如果最後的項目是'o.value == null' – weston

+0

也許惰性執行的LINQ查詢是第二個查詢的問題的責任? – psubsee2003

1
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(); 
相關問題