【C#】IEnumerableについてあれこれ

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


自分で実装する機会はそんなにないと思いますが、
知らないのもアレなので…(;´Д`)

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください