C#: IEnumerable, GetEnumerator, простой, простой пример!

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

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
}

Спасибо!

27
задан Andrew White 18 May 2010 в 19:36
поделиться

4 ответа

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

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

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

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
36
ответ дан 28 November 2019 в 04:44
поделиться

В дополнение к другим ответам, если вам нужно немного больше контроля над тем, как работает перечислитель, или если есть требование настроить его сверх того, что может обеспечить базовая структура данных, то вы можете использовать ключевое слово 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;
    }
  }
}
15
ответ дан 28 November 2019 в 04:44
поделиться
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, потому что вы теряете интеграцию с .NET, например, возможность использовать LINQ, но вы можете выполнять итерации по коллекции, используя foreach в C#.

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

public class AlbumList : List<Album>
{
}

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

9
ответ дан 28 November 2019 в 04:44
поделиться

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

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);
2
ответ дан 28 November 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: