Ejemplo n.º 1
0
        public void MultipleEnumerations_ShouldEnumerateOnce()
        {
            var enumerable       = new SingleEnumerable <int>(Enumerable.Range(1, 3));
            var cachedEnumerable = CachedEnumerable.Create(enumerable);

            Assert.Equal(new[] { 1, 2, 3 }, cachedEnumerable);
            Assert.Equal(new[] { 1, 2, 3 }, cachedEnumerable);
        }
Ejemplo n.º 2
0
        public void MultipleConcurrentEnumerations_ShouldEnumerateOnce()
        {
            // Arrange
            var count            = 0;
            var cachedEnumerable = CachedEnumerable.Create(new SingleEnumerable <int>(GetData()));

            IEnumerable <int> GetData()
            {
                yield return(++count);

                yield return(++count);

                yield return(++count);
            }

            var enumerator1 = cachedEnumerable.GetEnumerator();
            var enumerator2 = cachedEnumerable.GetEnumerator();

            // Act & assert
            Assert.True(enumerator1.MoveNext());
            Assert.Equal(1, enumerator1.Current);
            Assert.Equal(1, count);

            Assert.True(enumerator2.MoveNext());
            Assert.Equal(1, enumerator2.Current);
            Assert.Equal(1, count);

            Assert.True(enumerator2.MoveNext());
            Assert.Equal(2, enumerator2.Current);
            Assert.Equal(2, count);

            Assert.True(enumerator2.MoveNext());
            Assert.Equal(3, enumerator2.Current);
            Assert.Equal(3, count);

            Assert.True(enumerator1.MoveNext());
            Assert.Equal(2, enumerator1.Current);
            Assert.Equal(3, count);

            Assert.False(enumerator2.MoveNext());
            Assert.True(enumerator1.MoveNext());
            Assert.False(enumerator1.MoveNext());
            Assert.Equal(3, count);

            Assert.Equal(new[] { 1, 2, 3 }, cachedEnumerable);
        }
Ejemplo n.º 3
0
        public async Task MultipleConcurrentEnumerations_ShouldEnumerateOnce_ThreadSafe()
        {
            // Arrange
            var maxCount    = 1000;
            var threadCount = 16;
            var resetEvent  = new ManualResetEventSlim(initialState: false);

            var count            = 0;
            var cachedEnumerable = CachedEnumerable.Create(new SingleEnumerable <int>(GetData()));

            IEnumerable <int> GetData()
            {
                for (var i = 0; i < maxCount; i++)
                {
                    yield return(++count);
                }
            }

            var results = new List <int> [1000];
            var task    = Task.Run(() => Parallel.For(0, 1000, new ParallelOptions {
                MaxDegreeOfParallelism = threadCount
            }, i =>
            {
                results[i] = cachedEnumerable.ToList();
            }));

            resetEvent.Set();
            await task;

            // Act & assert
            Assert.Equal(maxCount, count);
            foreach (var result in results)
            {
                Assert.Equal(Enumerable.Range(1, maxCount), result);
            }
        }
        public void CollectionCreate01()
        {
            using var result = CachedEnumerable.Create(this.PersonProperList);

            this.Consumer.Consume(result);
        }
 /// <summary>
 /// Instantiates and returns a <see cref="CachedEnumerable{T}"/> for a given <paramref name="enumerable"/>.
 /// Notice: The first item is always iterated through.
 /// </summary>
 public static CachedEnumerable <T> ToCachedEnumerable <T>(this IEnumerable <T> enumerable)
 {
     return(CachedEnumerable <T> .Create(enumerable));
 }