如何覆盖 Skip() 和 Take()?

How do I override Skip() and Take()?

我需要以某种方式让 Linq Skip()Take() 重新实现,以便它们 return 与应用它们的项目相同的一组项目 - 什么都不跳过,全部拿走。我发现 this answer 关于覆盖 Where()。所以我制作了这个:

public interface IDataEnumerator<StoredItemType> : IEnumerable<StoredItemType>
{
    IDataEnumerator<StoredItemType> Skip(int count);
}

public class DataEnumerator<StoredItemType> : IDataEnumerator<StoredItemType>
{
    private IEnumerable<StoredItemType> storedItems;

    public DataEnumerator(IEnumerable<StoredItemType> items)
    {
        storedItems = items;
    }
    public IDataEnumerator<StoredItemType> Skip(int count)
    {
        return this;
    }

    public IDataEnumerator<StoredItemType> Take(int count)
    {
        return this;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }

    public IEnumerator<StoredItemType> GetEnumerator()
    {
        return storedItems.GetEnumerator();
    }
}

调用代码如下:

IEnumerable<int> enumerator = new DataEnumerator<int>(new List<int>());
enumerator = enumerator.Take(1).Skip(1);

调用了构造函数,但未调用 class 中的 Skip()Take()。我不明白这与 Where().

的其他答案有何不同

我缺少什么以及如何自定义 Skip()Take()

来自链接的答案:

Your Where method will only be called if the declared type is MyEnumerable - it will not be called on variables of type IEnumerable<MyClass> (or any collection that implements it, like List<MyClass>.

您将变量存储为 IEnumerable 因此它仍在使用 LINQ 扩展方法。