2010-05-07 11 views
5

Tengo una clase que contiene un número estático de objetos. Esta clase necesita ser frecuentemente 'comparada' con otras clases que serán simples objetos de la Lista.¿Cómo implemento IEnumerable?

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

los artículos son, evidentemente, no va a ser "X" "Y" "Z", los nombres son simplemente genéricos, por ejemplo. El problema es que, debido a la naturaleza de lo que se necesita hacer, una Lista no funcionará; aunque todo aquí va a ser de tipo Item. Es como una lista de verificación de cosas muy específicas contra las que se debe probar, tanto en código como en tiempo de ejecución.

Esto funciona todo bien y bien; no es mi problema Mi problema es iterarlo. Por ejemplo, quiero hacer lo siguiente ...

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

UncheckedItems contiene todos los elementos disponibles; y CheckedItems es la instancia de la clase Sheet. CheckedItems contendrá elementos que fueron movidos de Desmarcado a Marcado; sin embargo, debido a la naturaleza del sistema de almacenamiento, los elementos movidos a Revisado NO SE PUEDEN ELIMINAR de Desmarcado. Simplemente quiero repetir a través de "Comprobado" y eliminar cualquier cosa de la lista en Desmarcado que ya está en "Controlado".

Así que, naturalmente, eso sería así con una lista normal.

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

Pero como "Hoja" no es una "Lista", no puedo hacer eso. Así que quería implementar IEnumerable para poder hacerlo. ¿Alguna sugerencia? Nunca he implementado IEnumerable directamente antes y estoy bastante confundido sobre dónde comenzar.

Respuesta

12

Debe crear un iterador que devuelva los Elementos que residen en la Hoja.

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; 
     // ... 
    } 
} 

Si no quieren tener que llamar al método que se puede hacer esto.

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

También puede poner esas declaraciones de rendimiento directamente en el método GetEnumerator. –

+0

@Steve - Ahora eso es genial. – ChaosPandion

+0

@ ChaosPandion: incluso si se devuelve el objeto, ¿cómo se puede eliminar? ¿No es la pregunta también cómo eliminar el objeto? – Prashant

Cuestiones relacionadas