代码之家  ›  专栏  ›  技术社区  ›  Cristian Diaconescu

给定有限列表中的linq无限列表

  •  9
  • Cristian Diaconescu  · 技术社区  · 14 年前

    如果初始列表是 {1, 2, 3} ,我希望新列表返回 {1, 2, 3, 1, 2, 3, 1, ...}

    4 回复  |  直到 11 年前
        1
  •  17
  •   Julian    9 年前

    yield return 是一个相当方便的操作符,尽管它实际上并不特别需要LINQ。

    IEnumerable<int> GetInfiniteSeries(IEnumerable<int> items) {
        while (true) {
           foreach (var item in items) { 
               yield return item;
           }
        }
    }
    
        2
  •  6
  •   James Curran    14 年前
    IEnumerable<T> Infinite(this IEnumerable<T> ienum)
    {
        List<T> list = ienum.ToList();
        while (true)
           foreach(var t in list)
               yield return t;
    }
    
    
    
    foreach(int i in Enumerable.Range(1,3).Infinite())
          Console.WriteLine(i);
    
        3
  •  3
  •   Cristian Diaconescu    14 年前

    我最终是这样做的:

        public static IEnumerable<T> AdNauseam<T>(this IEnumerable<T> i_list)
        {
            using(var etor = i_list.GetEnumerator())
            {
                while(true)
                {
                    while(etor.MoveNext())
                    {
                        yield return etor.Current;
                    }
                    etor.Reset();
                }
            }
        }
    

    用法:

    var list = new[] {1, 2, 3}
    var infinite = list.AdNauseam().Take(10);
    

    {1, 2, 3, 1, 2, 3, 1, 2, 3, 1}
    
        4
  •  3
  •   Matt Greer    14 年前

    IEnumerator<T> :

      public class InfiniteEnumerator<T> : IEnumerator<T>
        {
            private IList<T> _items;
            private int _index = -1;
    
            public InfiniteEnumerator(IList<T> items)
            {
                if (items == null)
                {
                    throw new ArgumentNullException("items");
                }
                _items = items;
            }
    
            public T Current
            {
                get { return _items[_index]; }
            }
    
            public void Dispose()
            {
    
            }
    
            object System.Collections.IEnumerator.Current
            {
                get { return _items[_index]; }
            }
    
            public bool MoveNext()
            {
                if (_items.Count == 0)
                {
                    return false;
                }
    
                _index = (_index + 1) % _items.Count;
                return true;
            }
    
            public void Reset()
            {
                _index = -1;
            }
        }