【问题标题】:C#: IEnumerable, GetEnumerator, a simple, simple example please!C#:IEnumerable、GetEnumerator,请举个简单的例子!
【发布时间】:2011-02-21 01:47:56
【问题描述】:

尝试创建一个实现 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
}

谢谢!

【问题讨论】:

    标签: c# generics list dictionary


    【解决方案1】:

    您可以简单地返回 List.GetEnumerator 返回的枚举数:

    public class AlbumList : IEnumerable<Album>
    {
        // ...
    
        public IEnumerator<Album> GetEnumerator()
        {
            return this.albums.GetEnumerator();
        }
    
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
    

    【讨论】:

    • 您好,尝试了上述方法,但在 IEnumerator IEnumerable.GetEnumerator() “使用泛型类型 'System.Collections.Generic.IEnumerator' 需要 1 个类型参数”这一行出现编译器错误?
    • @Andrew White:没有泛型类型参数的 IEnumerable/IEnumerator 在 System.Collections 命名空间中。
    【解决方案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;
        }
      }
    }
    

    【讨论】:

    • +1 我喜欢您提出的关于对返回的列表进行更精细控制的附加点。谢谢。
    • 这帮助我将大约十行代码变成了一行代码。
    【解决方案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&lt;T&gt; 接口,因为您会松散与 .NET 的集成,例如使用 LINQ 的可能性,但您可以在 C# 中使用 foreach 迭代集合。

    或者这个更短:-)

    public class AlbumList : List<Album>
    {
    }
    

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

    【讨论】:

    • 嗨,尝试了上面的第一个示例,但在 IEnumerator IEnumerable.GetEnumerator() "Using the generic type 'System.Collections.Generic.IEnumerator' requires 1 type arguments “?
    • 您可能缺少 C# 文件顶部的 using System.Collections 行。
    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2021-06-21
      • 2010-12-02
      • 1970-01-01
      相关资源
      最近更新 更多