2014年08月27日

C#で条件を満たす行を取り除く

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その36

久しぶりに、"http://ja.doukaku.org/" にアクセスしたら、Not found になっていました。完全に閉鎖されてしまったようですね。
でも気にせず、このシリーズは続けます(^^;;

■問題 (出題者:にしお さん)
ファイルから1行ずつ読み込み、"#"で始まる行だけを取り除いてファイルに出力するコードを書いてください。
サンプル入力
hello!
# remove this
# don't remove this
bye!

サンプル出力
hello!
# don't remove this
bye!

#"で始まる行だけを取り除くプログラムだとつまらないので、タイトルどおりに「条件を満たす行を取り除くメソッド」を書いてみた。。
つまり条件を引き数として渡せるようにしてみた。

using System;
using System.IO;


namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            RemoveLines("sample.txt", "sampleOut.txt", s => s.StartsWith("#"));
        }       
        private static void RemoveLines(string infile, string outfile, Predicate<string> judge) {
            using (StreamReader sr = new StreamReader(infile))
            using (StreamWriter sw = new StreamWriter(outfile)) {
                while (!sr.EndOfStream) {
                    string s = sr.ReadLine();
                    if (!judge(s))
                        sw.WriteLine(s);
                }
            }
        }
    }
}

この例では、引き数として

  s => s.StartsWith("#")

を渡しているが、

  s => s.Length == 0

とすれば、長さが 0 の行を取り除くことができる。

  

Posted by gushwell at 22:00Comments(0)TrackBack(0)

2007年07月10日

StreamWriter

   このエントリーをはてなブックマークに追加 Clip to Evernote
.NET Framework の System.IO.StreamWriterって、Disposeメソッドを持っているにも関わらず、IDisposableインターフェースじゃないんですよね。

何でだろう?
単なるバグでしょうか?

追記(訂正)7/12
StreamWriterは、ちゃんと IDisposableインターフェースでした。m(_ _)m
いったい、何を勘違いしていたんでしょうか?

さらに追記 7/12 21:42
StreamWriterを使ったソースを見てみると、

internal sealed class MySample : IMySample, IDisposable {
private StreamWriter _writer;

public FileStatusManager() {
...
_writer = new StreamWriter(filename, true);
}

public void Dispose() {
_writer.Dispose();
}
}


※ sealed なのd、DisposeはこれでOK.

って書いてあって、usingを使うようなコードじゃない。
他のソースで、Disposeメソッドを使っているところを検索してみたけど、
みんな、上記のような使いばかりで、
  Xxxx xx = new Xxxx();
...
xx.Dispose();


のように書いている箇所はなかった。

なんで、あんな勘違いをしたのか、良く思いだせない...

  
Posted by gushwell at 21:57Comments(2)TrackBack(0)