2010年05月06日

string.Trimの動作が変更された

   このエントリーをはてなブックマークに追加 Clip to Evernote
.NET Framework4からString.Trim メソッドの動作が少し変わっているようです。

 

3.5 SP1 以前

.NET 4

ZERO WIDTH SPACE (U+200B) 削除 削除しない
ZERO WIDTH NO-BREAK SPACE (U+FEFF) 削除 削除しない
MONGOLIAN VOWEL SEPARATOR (U+180E) 削除 削除しない
NARROW NO-BREAK SPACE (U+202F) 削除しない 削除
MEDIUM MATHEMATICAL SPACE (U+205F) 削除しない 削除

まあ、僕にはあまり関係なさそうですが...
  

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

2010年04月28日

C#からJScriptのevalを呼び出し「四則演算式」を計算させる

   このエントリーをはてなブックマークに追加 Clip to Evernote
前回の「小町算」の続きです。
SelectManyとString.Formatで得た
"1234 + 5 - 678 * 9"
といった計算式(文字列)を計算させる必要がでてきます。
この結果が 100 ならば、小町算ということになります。

どうやって、プログラムで文字列で表された計算式を解釈し計算させるかですが、
ひとつは、逆ポーランド記法(後置記法)に変換し、スタックを使って計算するコードを書く方法。
でも一から書くとなるとちょっと面倒なので、System.CodeDom?.Compiler.JScriptCodeProviderを使い、 JScriptの式として計算させることにしました。

※ JScriptCodeProviderは、Microsoft.JScript アセンブリを参照に追加することで利用可能になります。

実行速度の面では不利かもしれませんが、JScriptCodeProviderを使ったほうがコードは確実に短くなると思います。

JScriptEvaluatorクラスというものを作り


のように書ければいろんなところで使えそうです。
staticメソッドにしてもいいですが、ここでは通常のインスタンスメソッドとして 実装しました。

このクラスの中では、System.CodeDom.Compiler.JScriptCodeProviderクラスを利用しています。
このJScriptCodeProviderクラスを使うと、JScriptのソースコードを C#側から動的にコンパイル・実行できます。
もちろん、C#から引数を渡して、そのメソッドを呼び出せます。

でも、リフレクション使っての呼び出しなので可読性が悪いです。
C#4.0のdynamic使えばもっと簡単に書けると思います。(試してません...)

ところで、ここでは、JScriptCodeProvider を使いましたが、CSharpCodeProvider を使っても同様のことが行えます。
しかし、C#だと型を意識したコードにしなければならないし、
1/2 は 0となってしまうので、1.0/2.0という式にしなくてはなりません。
JScriptのほうが都合がいいです。

ということで、JScriptEvaluator クラスのソースコードは、こちらに掲載しています。
  
Posted by gushwell at 21:01Comments(3)TrackBack(0)