我需要以某种方式重新实现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()
?
答案 0 :(得分:2)
来自链接的答案:
仅在声明的类型为MyEnumerable的情况下才会调用您的Where方法-不会对类型为
IEnumerable<MyClass>
的变量(或实现它的任何集合,如List<MyClass>
进行调用。
您将变量存储为IEnumerable
,因此它仍在使用LINQ扩展方法。