C# 实现IEnumerable的自定义集合
我知道,从技术上讲,接口用于读取而不是写入或编辑。但是,我想在下面的类中添加一个add和addrange函数,下面是我目前使用的不起作用的函数C# 实现IEnumerable的自定义集合,c#,interface,ienumerable,yield,C#,Interface,Ienumerable,Yield,我知道,从技术上讲,接口用于读取而不是写入或编辑。但是,我想在下面的类中添加一个add和addrange函数,下面是我目前使用的不起作用的函数 public class HrefCollection : IEnumerable<Href> { private IEnumerable<Href> hrefs; public IEnumerable<Href> Add( Href href ) { yield retur
public class HrefCollection : IEnumerable<Href>
{
private IEnumerable<Href> hrefs;
public IEnumerable<Href> Add( Href href )
{
yield return href;
}
public IEnumerable<Href> AddRange( List<Href> hrefs )
{
foreach( Href href in hrefs )
{
yield return href;
}
}
public IEnumerator<Href> GetEnumerator()
{
return hrefs.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return hrefs.GetEnumerator();
}
}
公共类HrefCollection:IEnumerable
{
私有可数HREF;
公共IEnumerable添加(Href Href)
{
收益率href;
}
公共IEnumerable AddRange(列出HREF)
{
foreach(Href中的Href)
{
收益率href;
}
}
公共IEnumerator GetEnumerator()
{
返回hrefs.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
返回hrefs.GetEnumerator();
}
}
我不太确定如何将收益率回报与私有列表相关联
谢谢你的帮助
foreach( Href href in hrefs )
{
yield return href;
}
应该是
foreach( Href href in this.hrefs )
{
yield return href;
}
foreach( Href href in hrefs )
{
yield return href;
}
IEnumerable
和IEnumerable
接口用于生成只读序列或提供集合中项目的只读视图
如果您希望能够将项目添加到集合中,那么在内部,您需要使用允许添加项目的数据结构——例如List
。您无法使用IEnumerable
或IEnumerable
接口添加项
public class HrefCollection : IEnumerable<Href>
{
private readonly List<Href> _hrefs = new List<Href>();
public void Add(Href href)
{
_hrefs.Add(href);
}
public void AddRange(IEnumerable<Href> hrefs)
{
_hrefs.AddRange(hrefs);
}
public IEnumerator<Href> GetEnumerator()
{
return _hrefs.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable)_hrefs).GetEnumerator();
}
}
公共类HrefCollection:IEnumerable
{
私有只读列表_hrefs=new List();
公共作废添加(Href Href)
{
_添加(href);
}
公共void AddRange(IEnumerable HREF)
{
_添加范围(hrefs);
}
公共IEnumerator GetEnumerator()
{
返回_hrefs.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return((IEnumerable)_hrefs).GetEnumerator();
}
}
公共类HrefCollection:ObservableCollection,IEnumerable{
//通过此[索引]访问
}
您可能有点困惑。你有理由不简单地使用列表吗?“一个界面是用来阅读而不是写或编辑的”??我不明白那种说法。你是说IEnumerable?我有点说错了,我的意思是IEnumerable接口不包含“add”方法,因为它用于从当前集合返回对象,而不是从其中添加或删除某些内容。我不想使用List(即使我可以实现IList),我想使用yield return,并了解它的工作原理和使用方法。@Burnzy:您能更具体一点吗?如果我调用addrange,集合将保持空。实际上,您应该去掉私有的IEnumerable HREF。您正在声明一个IEnumerable在另一个IEnumerable中。相反,您应该引用它。@Burzy,但使用yield永远不会添加到您拥有的集合中,只输出一个新集合。这是可行的,但它仍然很愚蠢,并且它不起到学习yield如何工作的作用。@tehMick:是的,但问题是“我想在下面的类中添加一个add和addrange函数”。我知道这个问题也提到了使用收益回报
,但答案是,您不能使用收益回报
将项目添加到集合中。
public class HrefCollection<T> : ObservableCollection<T>, IEnumerable<T> {
// access via this[index]
}