IEnumerable implementieren auf dem Grundstück
Vorausgesetzt, die Klasse
public class Foo
{
public List<Bar> Bar = new List<Bar>();
public string Something;
public TStatus Status;
}
Bar ist eine Klasse definiert, die als
public class Bar
{
public string Code;
public string Message;
public TStatus Status;
}
Brauche ich zum Durchlaufen der Liste, Leiste, aber ich kann nicht verwenden Sie eine foreach-da muss ich IEnumerable implementieren bin ich ein bisschen ein Neuling und habe Schwierigkeiten, arbeiten heraus, wie es zu implementieren, jede Hilfe zu schätzen.
List<Bar>
bereits implementiertIEnumerable
. Warum denken Sie, müssen Sie es selbst implementieren?- Reden Sie Durchlaufen die
Bar
Liste? oder redest du irgendwie Durchlaufen die Mitglieder der einzelnenBar
? Sie eine bereits Durchlaufen, ein List<t> object. - Konnte Sie nach dem code, der nicht kompiliert? Es gibt eine Menge Antworten, aber irgendwie, ich glaube nicht, dass diese dein problem Schildern.
- Warum sind Sie mit den öffentlichen Felder anstelle von Eigenschaften?
- bin ein wenig ein newbie..."
- Ok. Ich werde empfehlen, dass Sie schalten Sie auf Eigenschaften, da kannst du auch eigene Logik, um Sie, und überschreiben Sie Sie (wenn Sie Sie definieren, wie virtuelle)
- Der code, den ich gepostet hat complile. Es ist Teil eines webservice, beim schreiben einer client-Schnittstelle, um es der return foo mit einer Liste von n-bar-Felder. Auf der client-Seite kann ich nicht mit einer foreach zu iterieren, weil "Fehler 1 foreach-Anweisung funktionieren nicht auf Variablen vom Typ 'Foo', weil 'Foo' enthält keine öffentliche definition für "GetEnumerator'"
- Ich habe festgestellt, dass das problem ist, wenn ausgesetzt als webservice wird die Liste definiert, als array, verlieren die Fähigkeit aufzuzählen. Das ist eine andere Frage völlig, vielen Dank für deine Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein paar Dinge:
1.) Als für Ihre eigentliche Frage, haben Sie zwei Möglichkeiten:
Können Sie Durchlaufen die
Bar
Feld (oder Eigenschaft, wenn Sie es ändern, um eine Eigenschaft, wie unten beschrieben) in deinem code:Oder Sie können
Foo
implementierenIEnumerable<Bar>
(das ist komplizierter):Wird diese ermöglichen es Ihnen, dies zu tun:
Persönlich würde ich empfehlen die erste option. Es ist einfacher, und es sei denn
Foo
wirklich ist (anstatt es nur hat) eine Sammlung vonBar
Objekte, dann scheint es mehr intuitiv.2.) , Was Sie haben keine Eigenschaften, Sie sind in den öffentlichen Bereichen. Eine Eigenschaft hat einen getter und einen setter, und sieht ungefähr so aus:
Eigenschaften in der Regel betreiben, die auf eine einzige variable, bezeichnet einen Zusatzspeicher. Für die obige Eigenschaft, so etwas wie dieses:
Streng genommen, könnte man absolut jeden block von code, der eine Zeichenfolge zurück, in der
get
block, und Sie können alles, was überhaupt in derset
block (auch nichts, wenn das nicht eine gute Idee).Eigenschaften können Sie definieren, etwas, das sich verhält wie ein Feld (da kann man zuordnen mit dem Gleichheitszeichen) verwendet aber das Verhalten, das Sie angeben, wenn Sie dessen Wert abgerufen oder festgelegt. Jedoch eines der Themen, die mit sehr einfachen Eigenschaften (also nur direkt get/set-background-variable, die ohne weitere Logik) ist, dass es ein wenig zu ausführlich, für was Sie eigentlich tut. Das ist, warum C# 3.0 eingeführt wurde das Konzept von auto-Eigenschaften, die wie folgt Aussehen:
Hier
Something
sieht ein bisschen wie ein Feld, aber es ist tatsächlich eine Eigenschaft. Der C# - compiler erkennt diese syntax (ersetzt die code-Blöcke für beideget
undset
mit nur einem Strichpunkt) und schafft eine Unterlage, variable und fügt den code Lesen und in Sie schreiben.Kannst du es so machen:
Durch die Art und Weise, wenn Sie wollen, dass diese Eigenschaften, dass die Felder privat -, also:
Hält es wartbar in vielen weiteren Kontexten.
Sollten Sie in der Lage sein, die zum Durchlaufen der member der
Bar
leicht genug mitforeach
. Sie brauchen nicht zu implementierenIEnumerable
hier seitList<>
schon bedeutet also für Sie:Schätze, dass Sie dies tun möchten:
Können Sie Durchlaufen
List<T>
wie Sie ist.Auch - Sie sollten mit Eigenschaften oder automatisch Eigenschaften zu setzen, die
List<T>
usw. Öffentlichen Bereichen ist eine schlechte Praxis.Klasse:
Iteration:
Werde ich einen Sprung machen hier, dass das, was Sie zu tun versuchen, ist, eine Eigenschaft, um Ihre
Foo
Klasse, gibt einIEnumerable
oderIEnumerable<Bar>
und dass diese Eigenschaft braucht, um eine Art Filterung, die auf der Liste derBar
Objekte in derFoo.Bar
Feld.EDIT: Wenn dies klingt nicht wie das, was Sie zu tun versuchen, dann diese Antwort ist möglicherweise nicht für Sie. Bitte lassen Sie sich nicht meine Antwort führen Sie zu noch mehr Verwirrung.
Hier sind meine Annahmen über das problem:
Foo
undBar
sind geschachtelte Klassen, die innerhalb einer anderen Klasse, undTStatus
ist ein generischer parameter auf, die mit Klasse.Foo
gibt eine Sammlung vonBar
Objekte, die einenStatus
- Eigenschaft gleich derFoo
ObjektStatus
Eigenschaft. Ich bin nur so eine Vermutung hier, aber ich dachte, das könnte der Grund sein, warum Sie eineStatus
- Eigenschaft auf beidenFoo
undBar
.Unten ist eine komplette Implementierung, bietet eine
BarsFilteredByStatus
Eigenschaft auf dieFoo
Klasse. Dies nutzt .NET iterator-Funktionalität um eine gefilterte Auflistung vonBar
Objekte, woBar.Status
gleichFoo.Status
. Wenn dies scheint wie etwas entlang der Linien von, was Sie nach, dann gehen Sie voran, nehmen Sie diesen code und spielen Sie mit ihm.Folgende code funktioniert bei mir:
Sollte man sich den Namen Ihrer Instanz von der Liste andere als die Bar um Verwirrung zu vermeiden.