1: public static class EnumerableExtensions
2: {
3: public static IEnumerable<TItem> WithDisposabler<TItem>(this IDisposable disposable, IEnumerable<TItem> items)
4: {
5: if (disposable == null)
6: {
7: throw new ArgumentNullException("disposable");
8: }
9:
10: if (items == null)
11: {
12: throw new ArgumentNullException("items");
13: }
14:
15: return new DisposableEnumerable<TItem>(disposable, items);
16: }
17:
18: private class DisposableEnumerator<TItem> : IEnumerator<TItem>
19: {
20: private readonly IDisposable disposable;
21: private readonly IEnumerator<TItem> items;
22:
23: public DisposableEnumerator(IDisposable disposable, IEnumerator<TItem> items)
24: {
25: this.disposable = disposable;
26: this.items = items;
27: }
28:
29: public void Dispose()
30: {
31: this.items.Dispose();
32: this.disposable.Dispose();
33: }
34:
35: public bool MoveNext()
36: {
37: return this.items.MoveNext();
38: }
39:
40: public void Reset()
41: {
42: this.items.Reset();
43: }
44:
45: public TItem Current
46: {
47: get
48: {
49: return this.items.Current;
50: }
51: }
52:
53: object IEnumerator.Current
54: {
55: get
56: {
57: return Current;
58: }
59: }
60: }
61:
62: private class DisposableEnumerable<TItem> : IEnumerable<TItem>
63: {
64:
65: private readonly IDisposable disposable;
66: private readonly IEnumerable<TItem> items;
67:
68: public DisposableEnumerable(IDisposable disposable, IEnumerable<TItem> items)
69: {
70: this.disposable = disposable;
71: this.items = items;
72: }
73:
74: public IEnumerator<TItem> GetEnumerator()
75: {
76: return new DisposableEnumerator<TItem>(this.disposable, items.GetEnumerator());
77: }
78:
79: IEnumerator IEnumerable.GetEnumerator()
80: {
81: return this.GetEnumerator();
82: }
83: }
84: }