2013-03-27 182 views
7

我不能從IEnumerable列表中刪除元素,但此列表是對列表的引用,即其他類的私有屬性。 如果我把personsCollection.Remove(theElement)放在同一個類(類管理器)中,它的工作原理是完美的,但是我需要從其他類(類ManagerDelete)中刪除該元素。請問我該怎麼做? 謝謝。從通用列表中刪除元素

class Other 
{ 
    //Some code 
    public IEnumerable<Person> SearchByPhone (string value) 
    { 
     return from person in personCollection 
       where person.SPhone == value 
       select person; 
    } 
} 

class ManagerDelete 
{ 
//Some code 
IEnumerable<Person> auxList= SearchByPhone (value); 
//I have a method for delete here 
} 

class Manager 
{ 
//Some code 
private List<Person> personsCollection = new List<Person>(); 
} 

回答

12

不能從IEnumerable<T>刪除您需要IList<T>類型的它添加/直接從中刪除項目。

+1

'IList'沒有必要,'ICollection'就夠了。 – svick 2013-06-08 14:25:18

1

您可以將IEnumerable投射到IList。如果IEnumerable確實是List,這將起作用。然而,這是一個糟糕的設計。如果你想刪除項目,你應該公開列表IList,而不是IEnumerable

1

IEnumerable字面上只是一個接口說,我有這個集合,你可以遍歷它。

如果你看一看IEnumerable接口的實際細節,它不包含多,只有一個方法來允許呼叫者遍歷它:

http://msdn.microsoft.com/en-gb/library/9eekhta0.aspx

之所以List類型可以讓你刪除它們,它的內置IEnumerable接口的頂部,給你更多的功能。它應該表示可以操作的對象的集合。而IEnumerable根本不是爲此而設計的。

Remove方法實際上從底層ICollection接口List還實現莖:

http://msdn.microsoft.com/en-gb/library/bye7h94w.aspx

3

達倫是正確的。 沒有轉換成你可以做的清單:

personCollection = personCollection.Except(SearchByPhone(value)); 

in ManagerDelete。

+0

+1使用除了,但要小心,通過替換'personCollection'具有引用personCollection'的任何其他對象仍然指向舊的,這可以通過使用[BindingSource](http: //msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.aspx)或類似的類來充當間接。 – 2013-03-27 14:42:41

4

您需要了解IEnumerable接口允許您執行的操作。

I'v列出了您應該按設計使用的接口列表,以及在不同情況下需要時使用。在你的例子中IList是你需要使用的。

  • ICollection的定義爲所有非泛型集合類型的一般特徵(例如,大小,枚舉, 和線程安全)。

  • ICloneable允許實現對象將其本身的一個副本 返回給調用者。

  • IDictionary允許非泛型集合對象使用鍵/值對來表示其內容
    內容。

  • IEnumerable返回實現IEnumerator接口 (請參閱下表條目)的對象。

  • IEnumerator啓用集合項的foreach樣式迭代。

  • IList提供添加,刪除和索引
    對象順序列表中的項目的行爲。

+0

不要忘記'IList'和'IList '有區別,'List'可以實現'IList',但其他強類型列表可能不會。 – 2013-03-27 14:39:18

2

您可以使用ToList轉換的IEnumerableList,然後你可以從它刪除的東西。

var auxList= SearchByPhone (value).ToList(); 
auxList.Remove(something); 
1

除了其他答案:您的數據結構選擇似乎不夠。如果您真的打算從容器中移除元素,那麼您的容器一定不能是IEnumerable<>

考慮以下選擇:

  • IEnumerable<>ICollection<>開關;
  • 替換刪除(.Where())並獲取單獨過濾IEnumerable<>