2013-03-27 21 views
7

Ich kann ein Element nicht aus einer IEnumerable-Liste entfernen, aber diese Liste ist eine Referenz auf eine List, ein privates Attribut einer anderen Klasse. Wenn ich personsCollection.Remove(theElement) in der gleichen Klasse (Klassenmanager) setzen, funktioniert es perfekt, aber ich muss das Element seit der anderen Klasse (Klasse ManagerDelete) löschen. Bitte wie kann ich das tun? Danke.Löschen eines Elements aus einer generischen Liste

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>(); 
} 

Antwort

12

Sie nicht von einem IEnumerable<T> löschen können, müssen Sie es von Typ machen IList<T> zum Hinzufügen/Entfernen von Elementen aus es direkt.

+1

'IList' ist nicht notwendig,' ICollection' wäre genug. – svick

1

Sie können die IEnumerable in eine IList umwandeln. Dies funktioniert, wenn die IEnumerable wirklich eine List ist. Das ist jedoch ein schlechtes Design. Wenn Sie Elemente entfernen möchten, sollten Sie die Liste als IList, nicht IEnumerable offen legen.

1

Eine IEnumerable ist buchstäblich nur eine Schnittstelle zu sagen, ich habe diese Sammlung, können Sie darüber iterieren.

Wenn Sie einen Blick auf den tatsächlichen Einzelheiten der Schnittstelle IEnumerable nehmen, es enthält nicht viel, nur eine Methode Anrufer darüber iterieren zu ermöglichen:

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

Der Grund, warum List Typen können Sie sie entfernen, ist es oben der IEnumerable-Schnittstelle gebaut, so dass Sie mehr Funktionalität. Es soll eine Sammlung von Objekten darstellen, die Sie manipulieren können. Wobei ein IEnumerable dafür einfach nicht ausgelegt ist.

Die Remove Verfahren stammt tatsächlich aus dem zugrundeliegenden ICollectionList Schnittstelle, die auch implementiert:

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

3

Darren richtig ist. Ohne sich auf eine Liste konvertieren können Sie tun:

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

in ManagerDelete.

+0

+1 für die Verwendung Außer, aber seien Sie vorsichtig, dass durch das Ersetzen von 'personCollection' andere Objekte, die einen Verweis auf' personCollection' haben, immer noch auf den alten verweisen, dies kann mit einer [BindingSource] (http: //msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.aspx) oder eine ähnliche Klasse, die als Indirektion fungiert. –

4

Sie müssen verstehen, was eine IEnumerable Schnittstelle Ihnen ermöglicht.

I'v aufgeführt unter der Liste der Schnittstellen, die Sie von Entwurf verwenden sollten, wenn und unter verschiedenen Umständen erforderlich. In Ihrem Beispiel müssen Sie IList verwenden.

  • ICollection definiert allgemeine Eigenschaften (beispielsweise Größe, Aufzählung, und Thread-Sicherheit) für alle nicht-generische Sammlung Typen.

  • ICloneable Ermöglicht dem implementierenden Objekt, eine Kopie von sich selbst an den Aufrufer zurückzugeben.

  • IDictionary Ermöglicht einem nicht generischen Sammlungsobjekt die Darstellung seiner
    Inhalte mithilfe von Schlüssel/Wert-Paaren.

  • IEnumerable Gibt ein Objekt zurück, das die IEnumerator-Schnittstelle implementiert (siehe nächster Tabelleneintrag).

  • IEnumerator Aktiviert die Stiliteration von Sammlungselementen.

  • IList Bietet das Verhalten zum Hinzufügen, Entfernen und Indexieren von Elementen in einer
    sequenziellen Liste von Objekten.

+0

Vergessen Sie nicht, dass zwischen "IList" und "IList " ein Unterschied besteht, "List" kann "IList" implementieren, andere stark typisierte Listen jedoch nicht. –

2

können Sie ToList verwenden, um die IEnumerable einen List zu konvertieren und dann kann man Sachen von ihm entfernen.

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

Zusätzlich zu anderen Antworten: Ihre Datenstrukturwahl scheint nicht angemessen zu sein. Wenn Sie wirklich planen, Elemente aus einem Container zu entfernen, muss Ihr Container in erster Linie nicht und IEnumerable<> sein!

Betrachten Sie die folgenden Möglichkeiten:

  • Schalter IEnumerable<>-ICollection<>;
  • ersetzen entfernen mit herausfiltern (.Where()) und erhalten eine separate gefilterte IEnumerable<>.
Verwandte Themen