Подтвердить что ты не робот

С#: IEnumerable, GetEnumerator, простой, простой пример, пожалуйста!

Попытка создать класс uebersimple, который реализует 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
}

Спасибо!

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

В дополнение к другим ответам, если вам нужно немного больше контролировать, как работает счетчик, или если есть необходимость настроить его за пределами того, что может предоставить базовая структура данных, вы можете использовать ключевое слово 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;
    }
  }
}

Ответ 3

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 в С#.

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

public class AlbumList : List<Album>
{
}

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

Ответ 4

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

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);