2009-09-23 3 views
6

nehme ich eine Klasse Testcollection haben, die verwendet wird, um Objekte vom Typ-Test zu halten und wird alsIEnumerable Hinzufügen <T> zur Klasse von Collection abgeleitet

public class TestCollection : CollectionBase 

definiert Diese mich durch die Sammlung iterieren können entweder als

foreach(object o in collection) 
... 

oder

foreach(Test t in collection) 

aber nicht erlaubt Ich möchte neue Linq-Abfragen verwenden.

Wenn ich die Definition der Klasse zu

public class TestCollection : CollectionBase, IEnumerable<Test> 

und fügen Sie eine Methode

public new IEnumerator<Test> GetEnumerator() 
{ 
    foreach (Test o in this.List) 
     yield return o ; 
} 

dann Abfragen sind Linq ändern verfügbar.

jedoch diese neue Methode nicht nur für LINQ-Abfragen aufgerufen wird, sondern ist auch in der Legacy-Code (dh während des foreach (Objekt o in der Sammlung) und foreach (Test in Collection).

Gibt es genannt jede Unterschied zwischen der alten Art der Iteration durch die Sammlung und dieser neuen Art unter der Annahme, dass alle Elemente in der Auflistung vom Typ Test sind? Ich weiß, dass das Hinzufügen einer IEnumerator-Methode eine Ausnahme auslöst, wenn sie andere Typen als Test findet , aber ich möchte wissen, ob ich etwas übersehen habe

Antwort

2

Nein, Sie werden identische Ergebnisse sehen und nur eine einzige zusätzliche Stufe der Indirektion erfahren (da die neue GetEnumerator Methode einfach die existierende GetEnumerator Methode aufruft und ihre Ausgabe streamt).

0

Die aus einem Iterator kompilierte IEnumerator<T> implementiert die Methode Reset nicht EDIT: Ich meine, dass es eine NotImplementedException werfen wird.

Es ist eigentlich nichts falsch, aber wenn Sie die Reset Methode wollen, müssen Sie Ihre eigene Iterator-Klasse schreiben, die nicht schwer ist.

+1

Nein; it * implementiert * es - als eine 'NotImplementedException' zu werfen. Iteratorblöcke sind für diesen Zweck in Ordnung. –

+0

Das habe ich gemeint. – SLaks

13

Da Sie in 2.0 (oder höher) sind, vielleicht nur von Collection<T> erben?

public class TestCollection : Collection<Test> { 
    // your extra code here 
} 

Dann erhalten Sie IList<T>, ICollection<T>, IEnumerable<T> kostenlos und virtual Methoden, die Sie können override Ihren Stempel auf das Verhalten zu setzen.

+0

+1 Das ist auch eine gute Idee. –

+0

+1 .. ich stimme dem zu. –

+2

Ändern eines Basistyps ist eine brechende Änderung - wenn die Klasse bereits versandt wurde, sollte dies nicht getan werden. – SLaks

Verwandte Themen