IEnumerableというかインターフェースについて曖昧になりかけていたので備忘録程度に…
Microsoft公式リファレンスを見つつ、書いただけの簡単なものです。
IEnumerableインターフェース実装クラス
GetEnumeratorメソッドが実装必須となります。
IEnumeratorインターフェースを実装したクラスを返してあげましょう。
class TestClass : IEnumerable<string>
{
public string sampleText;
public TestClass(string _sampleText)
{
sampleText = _sampleText;
}
public IEnumerator<string> GetEnumerator()
{
return new TestEnumeratorClass(sampleText);
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
IEnumeratorインターフェース実装クラス
Currentプロパティ、MoveNextメソッド、Resetメソッドが実装必須となります。
今回はテキストファイルを読み込むようにしているので
各プロパティとメソッドで何の役割をしているかは以下の通りです。
| Currentプロパティ | 現在参照行 |
|---|---|
| MoveNextメソッド | 参照行を次の行へ移動する。 |
| Resetメソッド | リセットする。 |
class TestEnumeratorClass : IEnumerator<string>
{
private StreamReader stream;
private string current;
public TestEnumeratorClass(string _stream)
{
this.stream = new StreamReader(_stream);
}
public string Current
{
get
{
if (stream == null || current == null)
{
throw new InvalidOperationException();
}
return current;
}
}
object IEnumerator.Current
{
get { return this.Current; }
}
public bool MoveNext()
{
current = stream.ReadLine();
if (current == null)
return false;
return true;
}
public void Reset()
{
stream.DiscardBufferedData();
stream.BaseStream.Seek(0, SeekOrigin.Begin);
current = null;
}
#region IDisposable Support
private bool disposedValue = false;
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing) { }
current = null;
stream = null;
if (stream != null)
{
stream.Close();
stream.Dispose();
}
disposedValue = true;
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
}
実行部分
読み込んだテキストデータに対象文字列が何件あるかをLINQを利用してチェックするコードです。。
(LINQの使いかたについてはこの記事を参考にしてください。)
var sample1 = from text in new TestClass(@"C:\Work\hogehoge.txt")
where text.Contains("test")
select text;
Console.WriteLine("sample1:" + sample1.Count());
var sample2 = new TestClass(@"C:\Work\hogehoge.txt");
Console.WriteLine("sample2:" + sample2.Select(x => x)
.Where(x => x.Contains("test"))
.Count());
実行結果
sample1:2 sample2:2
自分で実装する機会はそんなにないと思いますが、
知らないのもアレなので…(;´Д`)
