CompareOptions 列挙体について
- 見つけた時は便利なものがあるなぁ、と思ったのですが、意外に使えるところが少なくて、うまく使えていません。
例えば、String.StartsWith(String, StringComparison) で書かれたコードを日本語で全角半角を無視したい場合、メソッドそのものを書きなおさないといけないです。String.StartsWith(String, Boolean, CultureInfo) が近いのですが、オプションが bool ignoreCase だけなので使えません。
CompareOptions が使えるのは、CompareInfo のメソッドだけなので、
CultureInfo.CurrentUICulture.CompareInfo.IsPrefix(String, String, CompareOptions)
に書き変えないといけません。
さらに、例えば全角半角を無視する Dictionary を作ろうとすると、StringComparer は
StringComparer.Create(CultureInfo, bool ignoreCase)
だけなので、自前の IEqualityComparer<string> を作ってやらないといけません。
String.StartsWith, StringComparer.Create など、bool ignoreCase を持っているメソッドに、CompareOptions を引数として受け取るメソッドがほしいです。
できれば .NET 4 で BCL に入れてもらえると、英語版の元コードを変えずにローカライズしやすくなるのでうれしいと思いますが、いかがでしょうか?- 種類を変更済みKoji 2009年7月6日 12:29
すべての返信
- Koji さん こんにちは。
さあ、どうなのでしょうか。私どもも機会を設けて聞いて回ってはいますが、同様なご要望はこれまであまり聞いたことがなく、どう扱ったらいいのか躊躇しています。Redmond の開発のものも存じていないのではないかと思います。
CompareOptions は列挙体のスロットが限られていて、細かな日本語の処理や拡張には向かないようにも思えますが、どうなのでしょうか。読み仮名フレームワークのライブラリーにある Comparer クラスも含めて、いろいろな方のご意見を伺いたいところです。
この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。- 編集済みディベロッパー製品開発統括部インターナショナルPM - MSFT 2009年7月8日 11:34
ご返信、ありがとうございます。International Pack はまだ使い始めて日が浅く、よく理解していないところが多いと思います、すみません。
Comparer クラスとおっしゃっているのは、2.0 beta に入っている JapaneseComparison とか IgnoreKanaKindComparison とかのことでしょうか? 2.0 beta はまだ見ていなかったので、先ほどダウンロードしてドキュメントを見てみました。StringComparer のサブクラスになっているのですね。これがあれば、Dictionary の IEqualityComparer<string> は作る必要がなくなりそうで、助かります。
個人的な好みの問題かもしれませんが、このようにすべてクラスが分かれている、というのは少し使いづらそうな感じを受けます。全角半角だけを無視したい時にはどれを使えばいいのでしょうか? 濁点無視など、おっしゃるように CompareOptions では不足する部分もあるかもしれず、モードを充実していただけるのは嬉しい限りです。おそらく無視する文字種の *Comparison クラスを、コンストラクタでネストしていけば組み合わせができるんだと思いますし、作る側からすれば、拡張性や保守の面から、enum よりもクラスを分けたい、という論理もわかりますが、使う側として個人的にはフラグや enum になっている方が使いやすいと思います。この辺はバランスなのかもしれませんが、年々増えていくようなものではないので、enum を1つ作ってラップするクラスを作って使いそうな気がします。
充実していただいている上で欲を言うのは申し訳ない気もするのですが、やはり BCL との相性が良くないことが気になります。StringComparer が使える場所が少ないので、例えば上記の String.StartsWith はやっぱり違うメソッドを使わなければならない、とか。CompareOptions じゃなくて StringComparer で行くならそれでも良いと思いますが、StringComparer にしてもやはり BCL の中で使える場所が少ないので、使える場所を増やしてほしいです。
あと、変換はできないのでしょうか? 私は見つけられていないだけかもしれませんが、Unicode の互換文字をまとめて変換したい(全角英字を半角英字に、半角カナを全角カナになど)時に、結局 LCMapString を interop して結構な量のコードを書いてしまった記憶があります。ご検討いただけると嬉しいです。
なんだか文句ばかりのようになってしまってすみません、基本的には感謝していることをお伝えしたいことをご理解いただければと思います。Koji さん、建設的なフィードバックを大変ありがとうございます。
批判なんて滅相もありません。こちらこそ、英語でしかドキュメントをご用意できなかったにも関わらず、これほど的確に懸念していた内容に関してご理解いただけていることに感謝いたします。
また他のかたからのご意見もお聞かせいただければと思いますが、いかがでしょうか。
この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。


