C# 实现IEnumerable的自定义集合

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

我知道,从技术上讲,接口用于读取而不是写入或编辑。但是,我想在下面的类中添加一个add和addrange函数,下面是我目前使用的不起作用的函数

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]
}