Как мне реализовать IEnumerable? - PullRequest
5 голосов
/ 07 мая 2010

У меня есть класс, который содержит статическое количество объектов. Этот класс необходимо часто сравнивать с другими классами, которые будут простыми объектами List.

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

элементы, очевидно, не будут "X", "Y", "Z", это просто общие названия, например. Проблема в том, что из-за характера того, что должно быть сделано, список не будет работать; хотя все здесь будет иметь тип Item. Это как контрольный список очень специфических вещей, которые должны быть проверены как в коде, так и во время выполнения.

Это работает все хорошо и хорошо; это не моя проблема. Моя проблема повторяется. Например, я хочу сделать следующее ...

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

UncheckedItems содержит все доступные элементы; и CheckedItems является экземпляром класса Sheet. CheckedItems будет содержать элементы, которые были перемещены из Unchecked в Checked; однако из-за особенностей системы хранения элементы, перемещенные в Checked, НЕ МОГУТ БЫТЬ УДАЛЕНЫ из Unchecked. Я просто хочу перебрать «Проверено» и удалить из списка «Не проверено» все, что уже есть в «Проверено».

Так естественно, что все было бы так с обычным списком.

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

Но поскольку «Лист» не является «Списком», я не могу этого сделать. Поэтому я хотел реализовать IEnumerable, чтобы я мог. Какие-либо предложения? Я никогда раньше не реализовывал IEnumerable напрямую, и я не совсем понимаю, с чего начать.

1 Ответ

12 голосов
/ 07 мая 2010

Вам необходимо создать итератор, который возвращает элементы, находящиеся на листе.

Использование итераторов

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

Если вы не хотите иметьЧтобы вызвать метод, вы можете сделать это.

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