C#:IEnumerable,GetEnumerator,一个简单,简单的例子,请!

And*_*ite 27 c# generics dictionary list

试图创建一个实现get枚举器的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
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

dtb*_*dtb 36

您只需返回List <T> .GetEnumerator返回的枚举器:

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

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

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Andrew White:没有泛型类型参数的IEnumerable/IEnumerator位于System.Collections命名空间中. (2认同)

Bri*_*eon 15

除了其他答案之外,如果您需要更多地控制枚举器的工作方式,或者是否需要在基础数据结构提供的范围之外进行自定义,那么您可以使用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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ven 9

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

或简化版本:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我不建议忽略IEnumerable<T>界面,因为你放弃了与.NET的集成,例如使用LINQ的可能性,但你可以使用foreachin C#迭代集合.

或者这个甚至更短:-)

public class AlbumList : List<Album>
{
}
Run Code Online (Sandbox Code Playgroud)

当然,最后一个是一个可变列表,可能不是你想要的.