This repository was archived by the owner on Jan 23, 2023. It is now read-only.
File tree Expand file treeCollapse file tree 3 files changed+37
-1
lines changedFilter options
+37
-1
lines changed Original file line number Diff line number Diff line change
@@ -99,10 +99,11 @@ public sealed override bool MoveNext()
99
99
for (IEnumerable<TSource> enumerable = GetEnumerable(0); enumerable != null; enumerable = GetEnumerable(_state - 1))
100
100
{
101
101
IEnumerator<TSource> enumerator = enumerable.GetEnumerator();
102
+
SetEnumerator(enumerator);
103
+
102
104
++_state;
103
105
if (enumerator.MoveNext())
104
106
{
105
-
SetEnumerator(enumerator);
106
107
StoreFirst();
107
108
return true;
108
109
}
Original file line number Diff line number Diff line change
@@ -345,5 +345,25 @@ public DelegateIterator(
345
345
346
346
void IDisposable.Dispose() => _dispose();
347
347
}
348
+
349
+
protected sealed class DisposeTrackingEnumerable<T> : IEnumerable<T>
350
+
{
351
+
public bool EnumeratorDisposed { get; private set; }
352
+
353
+
354
+
public IEnumerator<T> GetEnumerator() => new Enumerator(this);
355
+
IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this);
356
+
357
+
private sealed class Enumerator : IEnumerator<T>
358
+
{
359
+
private readonly DisposeTrackingEnumerable<T> _enumerable;
360
+
public Enumerator(DisposeTrackingEnumerable<T> enumerable) => _enumerable = enumerable;
361
+
public void Dispose() => _enumerable.EnumeratorDisposed = true;
362
+
public T Current => default;
363
+
object IEnumerator.Current => default;
364
+
public bool MoveNext() => false;
365
+
public void Reset() { }
366
+
}
367
+
}
348
368
}
349
369
}
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@
4
4
5
5
using System;
6
6
using System.Collections.Generic;
7
+
using System.Collections;
7
8
using Xunit;
8
9
9
10
namespace System.Linq.Tests
@@ -413,5 +414,19 @@ public void HashSetWithBuiltInComparer_HashSetContainsNotUsed()
413
414
Assert.Equal(new[] { "A", "a" }, input2.Union(input1, EqualityComparer<string>.Default));
414
415
Assert.Equal(new[] { "A" }, input2.Union(input1, StringComparer.OrdinalIgnoreCase));
415
416
}
417
+
418
+
[Fact]
419
+
public void UnionFollowedBySelectOnEmptyEnumerableInvokesDispose()
420
+
{
421
+
var enum1 = new DisposeTrackingEnumerable<int>();
422
+
var enum2 = new DisposeTrackingEnumerable<int>();
423
+
Assert.False(enum1.EnumeratorDisposed);
424
+
Assert.False(enum2.EnumeratorDisposed);
425
+
426
+
foreach (int value in enum1.Union(enum2)) { }
427
+
428
+
Assert.True(enum1.EnumeratorDisposed);
429
+
Assert.True(enum2.EnumeratorDisposed);
430
+
}
416
431
}
417
432
}
You can’t perform that action at this time.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4