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

时间:2018-09-20 14:26:26

标签: c# .net linq generics ienumerable

我需要以某种方式重新实现Linq Skip()Take(),以便它们返回与所应用的项相同的项集-跳过任何内容并全部使用。我发现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);

调用了构造函数,但未调用类中的Skip()Take()。我不知道这与Where()的其他答案有何不同。

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

1 个答案:

答案 0 :(得分:2)

来自链接的答案:

  

仅在声明的类型为MyEnumerable的情况下才会调用您的Where方法-不会对类型为IEnumerable<MyClass>的变量(或实现它的任何集合,如List<MyClass>进行调用。

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