【问题标题】:Limited enumerator wrapper有限的枚举器包装器
【发布时间】:2014-04-03 09:13:17
【问题描述】:

制作可移植集合我面临着对有限 IEnumerator 的需求,它需要一些其他的枚举器并限制它给定的项目数。 我说的是来自 LINQ 的 IEnumerable.Take(int) 的一些类似物。

所以我想要类似的东西:

var arr = new int[] {1, 2, 3, 4};
var originalEnumerator = arr.GetEnumerator();                   // Will enumerate 4 items
var limitedE =  new LimitedEnumerator(arr.GetEnumerator(), 2);  // Will enumerate 2 items
var limitedE2 = new LimitedEnumerator(arr.GetEnumerator(), 9);  // Will enumerate 4 items

【问题讨论】:

    标签: c# .net collections ienumerable ienumerator


    【解决方案1】:

    已有方法 Enumerable.Take 返回“有限”枚举。

    var arr = new int[] {1, 2, 3, 4};
    var originalEnumerator = arr.GetEnumerator(); // Will enumerate 4 items
    var limitedE =  arr.Take(2).GetEnumerator();  // Will enumerate 2 items
    var limitedE2 = arr.Take(9).GetEnumerator();  // Will enumerate 4 items
    

    通常您也不需要直接使用枚举器 - 考虑使用IEnumerable<T>

    【讨论】:

      【解决方案2】:

      我已经结束了 LimitedEnumerator 的这些普通版本和模板版本。 它们在所有可能的情况下都经过测试:)

      public class LimitedEnumerator : IEnumerator
      {
          protected readonly IEnumerator _enumerator;
          private readonly int _limit;
      
          private int _index;
      
          public LimitedEnumerator(IEnumerator enumerator, int limit)
          {
              if (enumerator == null) 
                  throw new ArgumentNullException("enumerator");
      
              if (limit < 0)
                  throw new ArgumentOutOfRangeException("limit");
              _enumerator = enumerator;
              _limit = limit;
              _index = 0;
          }
      
          public bool MoveNext()
          {
              var moveNext = _enumerator.MoveNext();
              if (moveNext)
                  Current = _enumerator.Current;
      
              return moveNext && ++_index <= _limit;
          }
      
          public void Reset()
          {
              _index = 0;
              _enumerator.Reset();
              Current = _enumerator.Current;
          }
      
          public object Current { get; private set; }
      }
      
      public class LimitedEnumerator<T> : LimitedEnumerator, IEnumerator<T>
      {
          public LimitedEnumerator(IEnumerator<T> enumerator, int limit) 
              : base(enumerator, limit)
          {
          }
      
          public void Dispose()
          {
              ((IEnumerator<T>)_enumerator).Dispose();
          }
      
          T IEnumerator<T>.Current
          {
              get
              {
                  return (T) Current;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-25
        • 1970-01-01
        相关资源
        最近更新 更多