トップ «前の日記(2011-03-05) 最新 次の日記(2011-03-10)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2011-03-08

_ C#でうまく書けなかったプログラム

ちょっとした状態を持つフィルタ処理があって、Javaだったら次のように書くところだ。

interface Filter {
    Filter filtrate(string, Writer wtr);
}
static Filter state1 = new StateA();
static Filter state2 = new StateB();
...
Filter filter = state1;
for (;;) {
    String s = ifile.readLine();
    if (s == null) {
        break;
    }
    filter = filter.filtrate(s, wtr);
}
...
wtr.close();

上でフィルタは受け取った行を処理し、次の状態を判断してそれを返す。

で、C#で作るのだから、クラスみたいな上っ面はいらなくて、多分デリゲートというかラムダでどうにかなるんじゃないかと思った。

で、まずは、上のfiltrate相当のメソッドを定義してみて

Func<string, TextWriter

まで書いてはたと気づく。このデリゲートが返すのは、第一パラメータにstring、第2パラメータにTextWriterを取るデリゲートだ。ということは、

Func<string, TextWriter, Func<string, TextWriter, Func<string...

書けない。

というわけで、interfaceというか、Classのような上っ面が必要なのかなぁと、Javaで書くのと同じようにinterfaceとclassで実装したのであった。

本日のツッコミ(全2件) [ツッコミを入れる]
_ matarillo (2011-03-09 00:00)

Funcを使わなければ、<br>delegate Filter Filter(string text, TextWriter writer);<br>Filter stateA = null;<br>Filter stateB = (x, y) => { DoSomething(); return stateA; }<br>みたいなことはできますね。

_ arton (2011-03-09 00:18)

ああ、そうか。それ自体を返す形で書けば良いわけですね(なんとなく、ActionかFuncのどちらかを使わなければならないような気分になってた)。どうもありがとうございます。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|

ジェズイットを見習え