2010-05-07 18 views
5

Ich habe eine Klasse, die eine statische Anzahl von Objekten enthält. Diese Klasse muss häufig mit anderen Klassen verglichen werden, bei denen es sich um einfache List-Objekte handelt. offensichtlich nicht als „X“ „Y“ „Z“ gehen, das sind nur Gattungsnamen zum BeispielWie implementiere ich IEnumerable?

public partial class Sheet 
{ 
public Item X{ get; set; } 
public Item Y{ get; set; } 
public Item Z{ get; set; } 
} 

die Einzelteile. Das Problem ist, dass eine Liste aufgrund der Art dessen, was zu tun ist, nicht funktionieren wird; obwohl alles hier von Typ Item sein wird. Es ist wie eine Checkliste sehr spezifischer Dinge, die sowohl im Code als auch in der Laufzeit getestet werden müssen.

Das funktioniert alles gut und gut; Es ist nicht mein Problem. Mein Problem besteht darin, es zu wiederholen. Zum Beispiel möchte ich Folgendes tun ...

List<Item> UncheckedItems = // Repository Logic Here. 

UncheckedItems enthält alle verfügbaren Elemente; und CheckedItems ist die Sheet-Klasseninstanz. CheckedItems enthält Elemente, die von "Ungeprüft" in "Geprüft" verschoben wurden. Aufgrund der Art des Speichersystems können Elemente, die auf "Checked" verschoben wurden, NICHT von "Ungeprüft" entfernt werden. Ich möchte einfach durch "Checked" iterieren und alles aus der Liste in Unchecked entfernen, die bereits in "Checked" ist.

So natürlich würde das mit einer normalen Liste so gehen.

foreach(Item item in Unchecked) 
{ 
if(Checked.Contains(item)) 
Unchecked.Remove(item); 
} 

Aber da "Blatt" keine "Liste" ist, kann ich das nicht tun. Also wollte ich IEnumerable implementieren, damit ich es konnte. Irgendwelche Vorschläge? Ich habe IEnumerable nie zuvor direkt implementiert und ich bin ziemlich verwirrt, wo ich anfangen soll.

Antwort

12

Sie müssen einen Iterator erstellen, der die Elemente zurückgibt, die sich im Sheet befinden.

Using Iterators

public partial class Sheet 
{ 
    public Item X{ get; set; } 
    public Item Y{ get; set; } 
    public Item Z{ get; set; } 

    public IEnumerable<Item> EnumerateItems() 
    { 
     yield return X; 
     yield return Y; 
     yield return Z; 
     // ... 
    } 
} 

Wenn Sie nicht wollen, um die Methode haben rufen Sie dies tun können.

public partial class Sheet : IEnumerable<Item> 
{ 
    public Item X{ get; set; } 
    public Item Y{ get; set; } 
    public Item Z{ get; set; } 

    public IEnumerator<Item> GetEnumerator() 
    { 
     yield return X; 
     yield return Y; 
     yield return Z; 
     // ... 
    } 

    IEnumerator IEnumerator.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 
+1

Sie können diese Yield-Anweisungen auch direkt in die GetEnumerator-Methode einfügen. –

+0

@Steve - Das ist jetzt cool. – ChaosPandion

+0

@ChaosPandion - Auch wenn das Objekt zurückgegeben wird, wie kann es entfernt werden? Ist nicht auch die Frage, wie man das Objekt entfernt? – Prashant

Verwandte Themen