代码之家  ›  专栏  ›  技术社区  ›  sharptooth

如何重写Skip()和Take()[[副本]

  •  0
  • sharptooth  · 技术社区  · 6 年前

    我需要找林克 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);
    

    构造函数被调用,但是 跳过() Take() 其中() .

    跳过() Take() ?

    1 回复  |  直到 6 年前
        1
  •  2
  •   BradleyDotNET Aniss    6 年前

    从链接的答案:

    只有当声明的类型是MyEnumerable时,才会调用Where方法—不会对类型为的变量调用它 IEnumerable<MyClass> (或任何实现它的集合,如 List<MyClass> .

    将变量存储为 IEnumerable 所以它仍然使用LINQ扩展方法。