【问题标题】:C#, how to use IEnumerator in a user defined classC#,如何在用户定义的类中使用 IEnumerator
【发布时间】:2009-11-26 13:53:20
【问题描述】:

我有一个包含 1 个属性的集合类 - 一个子类的数组。

为了这个问题。我有一个篮子类,然后 fruits[] 作为篮子的一个属性。例如,fruit 类包含 3 个属性。名称、颜色和尺寸。

我怎样才能使篮子类的行为,以便我可以在其上使用 foreach 循环?

【问题讨论】:

    标签: c#


    【解决方案1】:

    根据你已经拥有的,你可以做到这一点:

    foreach(fruit f in myBasket.fruits) { ... }
    

    这还不够好吗?如果你想使用foreach(fruit f in myBasket),你可以实现IEnumerable,并且在你的getEnumerator方法中只是冒泡调用fruits.getEnumerator,但实际上,我认为在那种情况下我宁愿让篮子继承一个水果列表:

    public class Basket : List<Fruit>() { ... }
    

    然后你根本不会使用私人成员fruits

    【讨论】:

      【解决方案2】:

      在这种简单的情况下,您可以将枚举委托给数组,如下所示:

      public class Basket: IEnumerable {
        private Fruit[] fruits;
      
        public IEnumerator getEnumerator() {
          return fruits.GetEnumerator();
        }
      }
      

      【讨论】:

      • 我建议使用通用的 IEnumerator,尽管必须将数组转换为 IEnumerable 才能这样做
      • 是的,我考虑过做通用的。但是,您需要两个GetEnumerator 实现(作为显式接口实现的非泛型实现,作为隐式实现的泛型),这可能会有些混乱,因为它会增加一些噪音。但你是对的,现在应该在生产代码中实现通用接口。
      【解决方案3】:

      虽然从List&lt;Fruit&gt; 派生可能更可取,但如果由于某种原因不符合您的要求,这里可以帮助您入门:-

      public class Basket : IEnumerable<Fruit>
      {
           private Fruit[] myFruit;
      
           public int Count { get; private set; }
      
           public IEnumerator<Fruit> GetEnumerator()
           {
              for (int i = 0; i < Count; i++)
                 yield return myFruit[i];
           }
           IEnumerator IEnumerable.GetEnumerator()
           {
             return GetEnumerator();
           }
      }
      

      【讨论】:

        【解决方案4】:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-29
          • 1970-01-01
          • 2011-10-18
          • 2013-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-07
          相关资源
          最近更新 更多