C #: IEnumerable, GetEnumerator, простой, простой пример, пожалуйста! - PullRequest
27 голосов
/ 18 мая 2010

Попытка создать класс uebersimple, который реализует get enumerator, но безумно терпит неудачу из-за отсутствия простых / неработающих примеров. Все, что я хочу сделать, это создать оболочку вокруг структуры данных (в данном случае это список, но мне может понадобиться словарь позже) и добавить некоторые функции.

public class Album
{
    public readonly string Artist;
    public readonly string Title;
    public Album(string artist, string title)
    {
         Artist = artist;
         Title = title;
    } 
}
public class AlbumList
{
    private List<Album> Albums = new List<Album>;
    public Count { get { return Albums.Count; } }

    .....
    //Somehow GetEnumerator here to return Album
}

Спасибо! * * 1004

Ответы [ 4 ]

36 голосов
/ 18 мая 2010

Вы можете просто вернуть перечислитель, возвращенный List .GetEnumerator:

public class AlbumList : IEnumerable<Album>
{
    // ...

    public IEnumerator<Album> GetEnumerator()
    {
        return this.albums.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
15 голосов
/ 18 мая 2010

В дополнение к другим ответам, если вам нужно немного больше контроля над тем, как работает перечислитель, или если требуется настроить его сверх того, что может обеспечить базовая структура данных, вы можете использовать ключевое слово yield. *

public class AlbumList : IEnumerable<Album>
{
  public IEnumerator<Album> GetEnumerator()
  {
    foreach (Album item in internalStorage)
    {
      // You could use conditional checks or other statements here for a higher
      // degree of control regarding what the enumerator returns.
      yield return item;
    }
  }
}
9 голосов
/ 18 мая 2010
using System.Collections;
using System.Collections.Generic;

public class AlbumList : IEnumerable<Album>
{
    private List<Album> Albums = new List<Album>();

    public int Count { get { return Albums.Count; } }

    public IEnumerator<Album> GetEnumerator()
    {
        return this.Albums.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

или упрощенная версия:

public class AlbumList
{
    private List<Album> Albums = new List<Album>();

    public int Count { get { return Albums.Count; } }

    public IEnumerator<Album> GetEnumerator()
    {
        return this.Albums.GetEnumerator();
    }
}

Я бы не советовал исключать интерфейс IEnumerable<T>, потому что вы теряете интеграцию с .NET, например, возможности использовать LINQ, но вы можете перебирать коллекцию, используя foreach в C #.

Или этот еще короче: -)

public class AlbumList : List<Album>
{
}

Конечно, последний является изменяемым списком, что, возможно, не совсем то, что вы хотите.

2 голосов
/ 19 мая 2010

Исходя из вашего комментария о том, что вы хотите иметь обертку вокруг структуры данных (списка) и функцию перечисления для возврата альбома, я думаю, вы говорите о свойствах индексатора, верно? Вот как вы это делаете:

public class Album
{
    public readonly string Artist;
    public readonly string Title;
    public Album(string artist, string title)
    {
         Artist = artist;
         Title = title;
    } 
}

public class AlbumList
{
    private List<Album> Albums = new List<Album>();
    public int Count
    {
        get { return Albums.Count; }
    }

    public Album this[int index]
    {
        get
        {
            return Albums[index];
        }
    }

    public Album this[string albumName]
    {
        get
        {
            return Albums.FirstOrDefault(c => c.Title == albumName);
        }
    }

    public void Add(Album album)
    {
        Albums.Add(album);
    }

    public void Remove(Album album)
    {
        Albums.Remove(album);
    }
}

Небольшая консольная программа:

        AlbumList albums = new AlbumList();
        albums.Add(new Album { Artist = "artist1", Title = "title1" });
        albums.Add(new Album { Artist = "artist2", Title = "title2" });

        for (int i = 0; i < albums.Count; i++)
        {
            Console.WriteLine(albums[i].Artist);
            Console.WriteLine(albums[i].Title);
        }

        Console.WriteLine("title for artist1");
        Console.WriteLine(albums["artist1"].Title);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...