如何覆盖 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 扩展方法。
我需要以某种方式让 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, likeList<MyClass>
.
您将变量存储为 IEnumerable
因此它仍在使用 LINQ 扩展方法。