使用Array实现IEnumerable

Wil*_*iam 11 c# ienumerable

这可能是一个简单的语法问题,但我无法弄清楚.

通常,我会这样做:

public class OrderBook : IEnumerable<PriceLevel>
{
    private readonly List<PriceLevel> PriceLevels = new List<PriceLevel>();

    public IEnumerator<PriceLevel> GetEnumerator()
    {
        return PriceLevels.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return PriceLevels.GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

但我没有列表,而是想使用数组 - 就像这样:

public class ArrayOrderBook : IEnumerable<PriceLevel>
{
    private PriceLevel[] PriceLevels = new PriceLevel[500];

    public IEnumerator<PriceLevel> GetEnumerator()
    {
        return PriceLevels.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return PriceLevels.GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

IEnumerator IEnumerable.GetEnumerator()似乎精编-但市民IEnumerator<PriceLevel>说,我需要某种形式的铸造-什么是这样做的最佳方式?

威廉

Fil*_*erg 14

试试这个:

public class ArrayOrderBook : IEnumerable<PriceLevel>
{
    private PriceLevel[] PriceLevels = new PriceLevel[500];

    public IEnumerator<PriceLevel> GetEnumerator()
    {
        return PriceLevels.AsEnumerable().GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return PriceLevels.GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)


Ser*_*rvy 6

从您自己的IEnumerable<T>实现中可以看出,您需要提供该方法的通用版本和非泛型版本来实现该接口.为此,由于方法具有相同的签名,因此其中一个需要是显式接口实现.在这种情况下List,泛型版本是类中的方法,非泛型版本是显式接口定义,因为通用版本通常更有用.对于数组,它已经具有非泛型版本作为实现,并且它在后续版本中添加了该方法的泛型版本.为避免重大更改,通用版本是显式接口定义.

有很多方法可以解决这个问题.这是三个简单的.

public IEnumerator<PriceLevel> GetEnumerator()
{
    return PriceLevels.AsEnumerable().GetEnumerator();
}


public IEnumerator<PriceLevel> GetEnumerator()
{
    IEnumerable<PriceLevel> enumerator = PriceLevels;
    return enumerator.GetEnumerator();
}

public IEnumerator<PriceLevel> GetEnumerator()
{
    return ((IEnumerable<PriceLevel>)PriceLevels).GetEnumerator()
}
Run Code Online (Sandbox Code Playgroud)