【发布时间】:2009-11-26 13:53:20
【问题描述】:
我有一个包含 1 个属性的集合类 - 一个子类的数组。
为了这个问题。我有一个篮子类,然后 fruits[] 作为篮子的一个属性。例如,fruit 类包含 3 个属性。名称、颜色和尺寸。
我怎样才能使篮子类的行为,以便我可以在其上使用 foreach 循环?
【问题讨论】:
标签: c#
我有一个包含 1 个属性的集合类 - 一个子类的数组。
为了这个问题。我有一个篮子类,然后 fruits[] 作为篮子的一个属性。例如,fruit 类包含 3 个属性。名称、颜色和尺寸。
我怎样才能使篮子类的行为,以便我可以在其上使用 foreach 循环?
【问题讨论】:
标签: c#
根据你已经拥有的,你可以做到这一点:
foreach(fruit f in myBasket.fruits) { ... }
这还不够好吗?如果你想使用foreach(fruit f in myBasket),你可以实现IEnumerable,并且在你的getEnumerator方法中只是冒泡调用fruits.getEnumerator,但实际上,我认为在那种情况下我宁愿让篮子继承一个水果列表:
public class Basket : List<Fruit>() { ... }
然后你根本不会使用私人成员fruits。
【讨论】:
在这种简单的情况下,您可以将枚举委托给数组,如下所示:
public class Basket: IEnumerable {
private Fruit[] fruits;
public IEnumerator getEnumerator() {
return fruits.GetEnumerator();
}
}
【讨论】:
GetEnumerator 实现(作为显式接口实现的非泛型实现,作为隐式实现的泛型),这可能会有些混乱,因为它会增加一些噪音。但你是对的,现在应该在生产代码中实现通用接口。
虽然从List<Fruit> 派生可能更可取,但如果由于某种原因不符合您的要求,这里可以帮助您入门:-
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();
}
}
【讨论】:
【讨论】: