35
|
1 using System.Collections.Generic;
|
20
|
2 using System.Collections;
|
|
3 using System;
|
|
4
|
|
5 public class IterableConverter<A,B> : IEnumerable<A> {
|
|
6 private IEnumerable<B> iterable;
|
|
7 private Converter<A,B> converter;
|
|
8
|
|
9
|
|
10 IEnumerator IEnumerable.GetEnumerator()
|
|
11 {
|
|
12 // call the generic version of the method
|
|
13 return this.GetEnumerator();
|
|
14 }
|
|
15
|
|
16 public IEnumerator<A> GetEnumerator()
|
|
17 {
|
|
18 return iterator ();
|
|
19 }
|
|
20
|
|
21 public IterableConverter(IEnumerable<B> _iterable,Converter<A,B> _converter)
|
|
22 {
|
|
23 iterable = _iterable;
|
|
24 converter = _converter;
|
|
25 }
|
|
26
|
|
27 public IEnumerator<A> iterator()
|
|
28 {
|
|
29 return new IteratorConverter<A,B>(iterable.GetEnumerator(),converter);
|
|
30 }
|
|
31
|
28
|
32 private class IteratorConverter<C,D> : IEnumerator<C>
|
20
|
33 {
|
28
|
34 public List<C> appLines { get; set; }
|
20
|
35
|
28
|
36 private IEnumerator<D> iterator;
|
|
37 private Converter<C,D> converter;
|
20
|
38
|
28
|
39 public IteratorConverter(IEnumerator<D> _iterator,Converter<C,D> _converter)
|
20
|
40 {
|
|
41 iterator = _iterator;
|
|
42 converter = _converter;
|
|
43 }
|
|
44
|
|
45 public bool MoveNext()
|
|
46 {
|
|
47 return iterator.MoveNext();
|
|
48 }
|
|
49
|
28
|
50 public C Current
|
20
|
51 {
|
|
52 get{
|
|
53 return converter.conv (iterator.Current);
|
|
54 }
|
|
55 }
|
|
56
|
|
57 public void Reset()
|
|
58 {
|
|
59 // ホントはremove?
|
|
60 iterator.Reset();
|
|
61 }
|
|
62
|
|
63 object IEnumerator.Current
|
|
64 {
|
|
65 get { return appLines; }
|
|
66 }
|
|
67
|
|
68 public void Dispose() {
|
28
|
69 ((IEnumerator<C>)this.appLines).Dispose ();
|
20
|
70 }
|
|
71 }
|
|
72
|
|
73
|
28
|
74 public interface Converter<C,D>{
|
|
75 C conv (D _b);
|
20
|
76 }
|
|
77
|
|
78 } |