ホチキス先生の「プログラマーと呼ばれたい」

InfoPath & SQL Server !

Posts Tagged ‘C#

10分でわかる – Visual Studio と C# で理解するオブジェクト指向プログラミング

leave a comment »

オブジェクト指向は現代プログラミングにおいては強力な手法だが、高度に抽象化された概念を伴うため理解するには適切な学習と訓練が必要である。そこで Visual Studio 2017 を使った C# プログラミングにより、具体的な例をあげて、オブジェクト指向を説明してみよう。

たとえばフォーム上にボタンがあり、ボタンの大きさをスライダの操作によって変化させるようなプログラムを考えよう。Visual Studio ならツールボックスにボタンコントロールとトラックバーが用意されているので、マウス操作だけでフォーム上に配置することができる。

OOP_001

OOP_002

トラックバーで変化させる値の範囲を、0から300にしよう。それには作成した trackBar1 のプロパティをプロパティウィンドウで変更する。Minimum の値は 0 のまま、Maximum の値を 300 に変更する。

OOP_003

次にトラックバーをマウスでダブルクリックし、トラックバーのスクロールイベントを作成する。ここに次のコードを書こう。これはオブジェクト指向ではないプログラミングの例だ。

————————————————————————————–

button1.Height = trackBar1.Value;
button1.Width = trackBar1.Value;

————————————————————————————–

OOP_004

ビルドして実行する。すると、スクロールバーを動かすことでボタンの高さの値と幅の値がスクロールバーの値になるので、大きさが変化する。ちゃんと動くプログラムができる。

OOP_005

OOP_006

OOP_007

フォームの大きさに対して 300 というボタンのサイズは大きすぎるので、スライダを右端によせればボタンがフォームからはみ出すようになる。

では、ここからだ。

スライダの値範囲は 0 ~ 300 のままとし、スライダを操作してもボタンのサイズが 100 ~ 200 の範囲に留まるようにプログラムを書き換えよう。if 文を知っていれば、たいてい次のようにコードを書くだろう。

————————————————————————————–

if (trackBar1.Value > 100 && trackBar1.Value < 200)
{
button1.Height = trackBar1.Value;
button1.Width = trackBar1.Value;
}

————————————————————————————–

OOP_008

もちろん、これで求める動作をするアプリケーションが得られる。しかし、オブジェクト指向では、こう考える。ボタンのサイズが 100 から 200 の範囲に留まるのは操作をする側で調節するのではなく、ボタン自体の性質にするべきだと考える。サイズを 100 以下にする指示や 200 以上にする指示を無視するように実装するのだ。

ではオブジェクト指向でやってみよう。

それにはもともと用意されたボタンオブジェクトに変更を加える必要がある。そこでオブジェクト指向の「継承」という概念を用いる。「継承」は、あるオブジェクトの性質を引き継ぐ別のオブジェクトを作る方法である。次のコードでは「継承」を利用して custumButton のオブジェクトを作っている。

————————————————————————————–

class CustomButton : Button
{

}

————————————————————————————–

そして Form1 クラスに myCustomButton の名前で CustomButton オブジェクトを作り、フォームの Load イベントで myCustomButton のインスタンスを生成してフォームに表示する。

————————————————————————————–

CustomButton myCustomButton;

————————————————————————————–

myCustomButton = new CustomButton();
this.Controls.Add(myCustomButton);

————————————————————————————–

OOP_009

この状態でビルドすると、フォームの左上にボタンができているが、これは Button オブジェクトを継承して作った CustomButton である。ただ、この CustomButton には何もコードを付け加えていないので、このままでは単なるボタンと同じである。

OOP_010

次に、この CustomButton に自分のサイズを変更するメソッドを定義する。こんなかんじだ。

————————————————————————————–

public void changeSize(int x)
{
this.Height = x;
this.Width = x;
}

————————————————————————————–

これにより CustomButton オブジェクトは changeSize メソッドを持つことになり、myCustomButton.changeSize(100) のようにしてサイズを変更できるようになる。

ここでさらに、ボタンのサイズを 100 ~ 200 に限定するため、次のようにコードを書き加える。

————————————————————————————–

public void changeSize(int x)
{
if (x > 100 && x < 200)
{
this.Height = x;
this.Width = x;
}
}

————————————————————————————–

このことにより、ボタン自身がサイズの変更を 100 ~ 200 の場合のみ受け付けるようになる。トラックバーのスクロールイベントには次のようなコードを書く。

————————————————————————————–

myCustomButton.changeSize(trackBar1.Value);

————————————————————————————–

OOP_011

OOP_012

OOP_013

OOP_014

これにより、ボタンのサイズを変更するプログラムは、全体のコードでは changeSize メソッドを利用して「大きさ変われ」と指示を出し、それを受けたカスタムボタンオブジェクト自身が指示通り動くかどうかを判断して動くようになる。カスタムボタンは 100 ~ 200 の値しか受け付けないので、それ以外の指示を出しても無視する挙動をする。オブジェクトにふるまいを実装することで、値の指示範囲を主プログラム側で気にする必要がなくなるのだ。

さらに CustomButton クラスの記述を分離コードの Form1.Designer.cs に移動すると、プログラム全体はより見やすくなる。

OOP_015

OOP_016

さらに c# には、オーバーロードという概念があり、同じ名前のメソッドでも引数の型が異なれば重複して実装することができる。たとえばこのカスタムボタンに、サイズが 150 × 150 の決まった「mid」サイズの定義があるとして、それを次のように定義することができる。

————————————————————————————–

public void changeSize(string x)
{
this.Height = 150;
this.Width = 150;
}

————————————————————————————–

OOP_017

全体のコードでは、数値で大きさを変える changeSize メソッドと同じ名前でカスタムボタンに「ミッドサイズになれ」と指示を出すことができる。

————————————————————————————–

myCustomButton.changeSize(“mid”);

————————————————————————————–

新しくフォームに作ったボタンをクリックして「ミッドサイズ」にするコードは次の通りだ。

————————————————————————————–

OOP_018

このようにオブジェクト指向プログラミングでは「ふるまい」をオブジェクトの側に実装し、全体のプログラムからは

180 × 180 の大きさになれ

myCustomButton.changeSize(180);

ミッドサイズの大きさになれ

myCustomButton.changeSize(“mid”);

といった指示を出すように書くことができるようになる。このことでオブジェクトのふるまいがオブジェクト自身に記述され、プログラム全体が見やすく、また合理的にコントロールできるようになる。

2018年3月8日

松本 吉生(まつもとよしお)
Microsoft MVP Data Platform

1961年京都に生まれ、神戸で幼少期を過ごす。大学で応用化学を学んだのち、理科教諭として高等学校に勤務する。教育の情報化が進む中で校内ネットワークの構築運用に従事し、兵庫県立明石高等学校で文部科学省の「光ファイバー網による学校ネットワーク活用方法研究開発事業」に携わる。兵庫県立西宮香風高等学校では多部制単位制の複雑な教育システムを管理する学籍管理データベースシステムをSQL ServerとInfoPath、AccessなどのOfficeソフトウエアによるOBA開発で構築・運用する。現在は兵庫県立神戸工業高等学校でC#プログラミング、IoTなどのコンピュータ教育を行う。2004年からマイクロソフトMVP(Microsoft Most Valuable Professional)を受賞し、現在14回目の連続受賞。2016年にマイクロソフト認定教育者(Microsoft Innovative Educator Experts : MIEE)を受賞し、現在3回目の連続受賞。

広告

プログラミングのできない学者や有識者がプログラミング教育をねじ曲げる – プログラミングの「プ」の字もなかった教科「情報」迷走の轍をふまないために – プログラミング教育の体系化が緊急課題

with 2 comments

念のため、本文はあくまでも現場の一教員による私見であることを断っておく。

2003年から教科「情報」が高等学校ではじまったとき「教科『情報』はコンピュータを教える教科ではない」と声高に叫ばれ、そこで台頭してきたのは「なになに情報教育学会」といった新興のステークホルダーである。それは、長年日本のコンピュータ教育をけん引してきた情報処理学会とは異にした流れの、教育学や認知科学分野の学者や有識者によるものだった。当時の雰囲気は「情報処理は情報教育学の単なる一分野にすぎない」といった論調が主流であった。おそらくボタンの掛け違いはここに始まった。このために情報教育はコンピュータやインターネットを正面からとりあげず、普遍的なメディア論やプレゼンテーションやディベート、調べ学習、問題解決学習、共同学習、さらには道徳のような「情報モラル」に偏り、プログラミングの「プ」の字もなく始まった。

2003年にはじまり15年間の迷走を続けた教科「情報」は、ようやく小学校のプログラミング教育をきっかけに本来の目標に立ち戻ろうとしている。だが問題は、教科「情報」がはじまったときと似た現象、つまりプログラミングのできない学者や有識者がプログラミング教育のステークホルダーに居座り続けようとしていることだ。そのため、たとえば文部科学省の調査研究協力者会議「小学校段階における論理的思考力や創造性、問題解決能力等の育成とプログラミング教育に関する有識者会議」では2016年6月16日に出した「小学校段階におけるプログラミング教育の在り方について(議論の取りまとめ)」にわざわざ「コーディング(プログラミング言語を用いた記述方法)を覚えることがプログラミング教育の目的であるとの誤解が広がりつつあるのではないかとの指摘もある」「時代を超えて普遍的に求められる力としての『プログラミング的思考』などを育むことであり、コーディングを覚えることが目的ではない。」などと書かれている。

めまいがするほどだ。コーディングを覚えずに時代を超えて普遍的に求められる「プログラミング的思考」など身につくなどと本気で思っているのだろうか。

この現状は、おそらく、いわば「外国に行ったことのない学者や有識者が国際理解教育を作ろうとしている」くらいの状況である。

その一方で、主として小学校の現場では、先駆的な教員によって自主的にプログラミング教育の実践が始まっている。子どもたちに扱いやすい教材、わかりやすいカリキュラム、実習をしやすい環境構築を模索している。インターネットを通じた実践交流も活発に行われている。もはや緊急の課題は、初等中等教育を通じたプログラミング教育の体系化である。「プログラミング教育はプログラミングを教えるものではない」などと禅問答をしている場合ではないのだ。

小学校では流れ図に示される構造化、つまり順次構造、反復構造、条件分岐でいいとして、ブロック型プログラミングから始めることがいいだろう。簡単なマイコンボードを使った計測や制御も取り入れるべきだ。ではその次はどうか。中学校では何をするのか、高等学校では何をするのか。

まず何よりもオブジェクト指向を取り上げるべきだ。オブジェクト指向がわからなければ現代プログラミングを理解したことにならない。かく言う私もオブジェクト指向を理解するには時間がかかった。「オブ脳」という言葉があるように、オブジェクト指向は言葉で説明されて理解できるものではなく、例えれば自転車に乗れるようになるようなものだ。子どもが自転車に乗れるようになる瞬間、それは突然やってくる。なんどもなんども失敗を繰り返し、ほんの数センチでさえ動いて倒れる様子を見ていると、はたして本当に乗れる日が来るのだろうかと心配になるが、乗れるようになるのは突然である。そして一度乗れるようになれば、あたりまえのようにすいすいとこげるようになる。

オブジェクト指向を理解するにはオブジェクト指向プログラミングをしなければならない。自分でコードを書き、動かしてはじめてオブジェクト指向は理解できる。「オブジェクト指向はカプセル化、継承、ポリモーフィズム」と暗記するだけでは何の意味もない。なぜプログラミングはオブジェクト指向になったのか、オブジェクト指向の何がいいのか、どこでどうオブジェクト指向を利用すればいいのか、を理解しなければ意味がない。それには言語として C# (C Sharp) がいいと断言できる。かつて BASIC が初心者にとって学びやすい言語であったのと同じくらい C# はオブジェクト指向を学ぶ初心者にとって学びやすい。言語仕様が正確であり、JIS や ISO にも規定されている。ポインタやガーベージコレクションを意識する必要もない。書法は簡潔で美しい。Visual Studio という優れた開発環境もある。

すぐれた自転車教室にはノウハウがあり、一日やれば必ず乗れるようになるプログラムがある。それと同じように、オブジェクト指向も優れたカリキュラムがあれば誰でも理解できるようになる。中学校段階なら必ず理解できる。オブジェクト指向とともに理解しなければならないことは、イベントドリブンである。サーバーサイドプログラミングも中学校では身につけさせたい。Webサービスのインタフェースなどは中学生段階でも理解できるだろう。

コンピュータの抽象化、クラウドコンピューティングは高等学校の内容になるだろう。機械学習や AI、データ処理を通じてイベントドリブンからデータドリブンのプログラミングを学ぶ必要がある。マイコンボードをネットワークにつなぎセンサのデータを集めるIoTからデータベースを学ぶ必要もあるだろう。近い将来クラウドコンピューティングは革命的に転換しそうなので、関数型プログラミングやサーバーレスといった技術がテーマになるだろう。

数年後には小学校でプログラミングの基礎を身につけた子どもたちが中学校へ、そして高等学校へ進学してくる。必要なことはプログラミングのできる学者や有識者が情報教育をけん引し、プログラミング教育を体系化することだ。現場の教員も口を開けて待つのではなく、自己研鑽と教材研究にいますぐ取り組むべきである。

2018年1月12日

松本 吉生(まつもとよしお)
Microsoft MVP Data Platform

1961年京都に生まれ、神戸で幼少期を過ごす。大学で応用化学を学んだのち、理科教諭として高等学校に勤務する。教育の情報化が進む中で校内ネットワークの構築運用に従事し、兵庫県立明石高等学校で文部科学省の「光ファイバー網による学校ネットワーク活用方法研究開発事業」に携わる。兵庫県立西宮香風高等学校では多部制単位制の複雑な教育システムを管理する学籍管理データベースシステムをSQL ServerとInfoPath、AccessなどのOfficeソフトウエアによるOBA開発で構築・運用する。現在は兵庫県立神戸工業高等学校でC#プログラミング、IoTなどのコンピュータ教育を行う。2004年からマイクロソフトMVP(Microsoft Most Valuable Professional)を受賞し、現在14回目の連続受賞。2016年にマイクロソフト認定教育者(Microsoft Innovative Educator Experts : MIEE)を受賞し、現在3回目の連続受賞。

C# プログラミング – Visual Studio 2017 で作る Windows Form アプリケーションで起動時にテキストファイルを読み込む。

leave a comment »

教科「情報」の「情報の科学」の授業で、定期的に文字入力のトレーニングをするための簡単なプログラムを作っている。あらかじめ登録されたテキストと同じテキストをテキストボックスに入力し、正しく入力できたか、何文字入力したか、入力にかかった時間は何分何秒か、を記録するトレーニングツールだ。

文字入力トレーニングソフトの画面_mid_640

フォームのイメージはこんなかんじ。テキストボックスは「開始」のボタンが押されるまでは使えないようにしておき、「開始」で時間を計測する。「終了」で時間の計測を終え、入力できた文字列を評価する。

このプログラムを生徒に配布するのだが、入力原稿に相当するテキストを、その都度プログラム内に保存しなければならない。このとき、原稿テキストをテキストファイルにしておき、プログラムを起動するときに読み込むようにした。テキストファイルはプログラムと同じフォルダに置いてもいいが、ファイルが丸見えでは触られてしまう可能性が高いので「settings」フォルダの下に入れることとした。

文字入力トレーニングソフトの画面_002_mid_640_480

プログラムでテキストファイルを読み込むコードは次のとおりだ。

—————————————————————————-

myFileName = @”settings\inputtext.txt”; //テキストファイルの場所を示す
enc = System.Text.Encoding.GetEncoding(“shift_jis”); //エンコーディングを指定

//テキストファイルの読み込み
try
{
myInputTextString = System.IO.File.ReadAllText(myFileName, enc);
}
catch
{
MessageBox.Show(“テキストファイルがありません”);
}

—————————————————————————-

これで、生徒にプログラム本体とテキストファイルが入った「settings」フォルダを一緒に配布すればいい。

2017年4月19日

松本 吉生(まつもとよしお)
Microsoft MVP Data Platform

1961年京都に生まれ、神戸で幼少期を過ごす。大学で応用化学を学んだのち、理科教諭として高等学校に勤務する。教育の情報化が進む中で校内ネットワークの構築運用に従事し、兵庫県立明石高等学校で文部科学省の「光ファイバー網による学校ネットワーク活用方法研究開発事業」に携わる。兵庫県立西宮香風高等学校では多部制単位制の複雑な教育システムを管理する学籍管理データベースシステムをSQL ServerとInfoPath、AccessなどのOfficeソフトウエアによるOBA開発で構築・運用する。現在は兵庫県立神戸工業高等学校でC#プログラミング、IoTなどのコンピュータ教育を行う。2004年からマイクロソフトMVP(Microsoft Most Valuable Professional)を受賞し、現在14回目の連続受賞。2016年にマイクロソフト認定教育者(Microsoft Innovative Educator Experts : MIEE)を受賞。

C# – 文字列を比較するアルゴリズムについて考える(1) – 2つの文字列を前から順に比較し、違いがあった位置を見つけるアルゴリズム

leave a comment »

学校の授業で文字入力のトレーニングをするために、効果的なアプリケーションを作っている。ここで必要な実装として文字列比較がある。

仕様、というか、個人で作るアプリケーションなので厳密な仕様は決めないが、イメージ的にはこうだ。入力トレーニングの元になる文がある。この文は、フォントやポイント、文字飾りなどは無視し、単にテキスト文字列だけのものとする。つまり単なるテキスト文とする。この文と同じ文をキーボードから入力するトレーニングとし、入力にかかった時間と入力できた文字数をカウントしてスコアとする。このとき、入力を間違ったことを評価に加えたい、というものだ。

すぐに思いつくのは、文字列を前から順番に比較し、違いがあったら位置を見つけ出すアルゴリズムだ。2つの文字列が myStr1 と myStr2 に入っており、2つの文字列の長さが同じだとする。

——————————————————————

for (int i = 0; i < myStr1.Length; i++)
{
if (myStr1[i] != myStr2[i])
{
myStrDiff = i;
break;
}
}

——————————————————————

前から順に比較し、違いがあった文字でループを抜ける。前から何文字目であったかが myStrDiff に数字として入る。この数字は 0 から始まるので、実際は +1 文字目に違いがあった、となる。これだと、たとえば次のようになるだろう。

myStr1 = “あいうえおかきくけこ”;
myStr2 = “あいうえおまきくけこ”;

このとき、myStrDiff の値は 5となる。前から 6文字目に違いがあるからだ。しかし、「か」を「ま」と間違えてはいるが、そのあとはちゃんと入力できている。つまり「5文字目までしか間違いなく入力できなかった」のではなく「6文字目だけ間違えたが、それ以外はちゃんと入力できた」はずだ。つまり、このように評価すべきだろう。

入力すべき文字列 ・・・ あいうえおかきくけこ
実際の入力1 ・・・・・ あいうえおかきくけこ (評価10点:満点)
実際の入力2 ・・・・・ あいうえおまきくけこ (評価9点:1文字だけ間違った)
実際の入力3 ・・・・・ あいうえおまみむめも (評価5点:5文字間違った)

つまり、間違った文字以降をどう再判定するか、を考えなければならない。このアルゴリズムについて引き続き考えていきたい。

2017年4月7日

松本 吉生(まつもとよしお)
Microsoft MVP Data Platform

1961年京都に生まれ、神戸で幼少期を過ごす。大学で応用化学を学んだのち、理科教諭として高等学校に勤務する。教育の情報化が進む中で校内ネットワークの構築運用に従事し、兵庫県立明石高等学校で文部科学省の「光ファイバー網による学校ネットワーク活用方法研究開発事業」に携わる。兵庫県立西宮香風高等学校では多部制単位制の複雑な教育システムを管理する学籍管理データベースシステムをSQL ServerとInfoPath、AccessなどのOfficeソフトウエアによるOBA開発で構築・運用する。現在は兵庫県立神戸工業高等学校でC#プログラミング、IoTなどのコンピュータ教育を行う。2004年からマイクロソフトMVP(Microsoft Most Valuable Professional)を受賞し、現在14回目の連続受賞。2016年にマイクロソフト認定教育者(Microsoft Innovative Educator Experts : MIEE)を受賞。

C# – 文字列を比較する(5)– System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスの System.Globalization.CompareOptions の IgnoreSymbols オプションで $%&!#'()*?<>^~-+ の特殊記号やスペースを無視して評価する。

leave a comment »

System.Globalization.CompareOptions には IgnoreSymbols オプションがある。このオプションを使うと、$ や %、# などの特殊記号やスペースを無視して文字列を評価できる。まず IgnoreSymbols オプションを使わない例だ。次の例では文字列に特殊記号やスペースが入っているので「違う」と評価する。

——————————————————————–

string a = “あいうえお”;
string b = “あ$い%う&え  お!#'()*?<>^~-+”;
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare(a, b) ==0)
textBox1.Text = “同じ”;
else
textBox1.Text = “違う”;

——————————————————————–

しかし次のように System.Globalization.CompareOptions の IgnoreSymbols オプションを使うと、同じと評価する。

——————————————————————–

string a = “あいうえお”;
string b = “あ$い%う&え  お!#'()*?<>^~-+”;
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare
(コードの続き)(a, b, System.Globalization.CompareOptions.IgnoreSymbols) ==0)
textBox1.Text = “同じ”;
else
textBox1.Text = “違う”;

——————————————————————–

2017年4月6日

松本 吉生(まつもとよしお)
Microsoft MVP Data Platform

1961年京都に生まれ、神戸で幼少期を過ごす。大学で応用化学を学んだのち、理科教諭として高等学校に勤務する。教育の情報化が進む中で校内ネットワークの構築運用に従事し、兵庫県立明石高等学校で文部科学省の「光ファイバー網による学校ネットワーク活用方法研究開発事業」に携わる。兵庫県立西宮香風高等学校では多部制単位制の複雑な教育システムを管理する学籍管理データベースシステムをSQL ServerとInfoPath、AccessなどのOfficeソフトウエアによるOBA開発で構築・運用する。現在は兵庫県立神戸工業高等学校でC#プログラミング、IoTなどのコンピュータ教育を行う。2004年からマイクロソフトMVP(Microsoft Most Valuable Professional)を受賞し、現在14回目の連続受賞。2016年にマイクロソフト認定教育者(Microsoft Innovative Educator Experts : MIEE)を受賞。

C# – 文字列を比較する(4)– System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスの System.Globalization.CompareOptions の IgnoreKanaType オプションでカタカナとひらがなを同じに評価する。

leave a comment »

System.Globalization.CompareOptions には IgnoreKanaType オプションがある。このオプションを使うと、カタカナとひらがなを同じとして評価できる。まず IgnoreKanaType オプションを使わない例だ。次の例ではカタカナとひらがなを「違う」と評価する。

——————————————————————–

string a = “アイウエオ”;
string b = “あいうえお”;
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare(a, b) ==0)
textBox1.Text = “同じ”;
else
textBox1.Text = “違う”;

——————————————————————–

次に IgnoreKanaType オプションを使った例を示す。この例ではカタカナとひらがなを「同じ」と評価する。

——————————————————————–

string a = “アイウエオ”;
string b = “あいうえお”;
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare
(コードの続き)(a, b, System.Globalization.CompareOptions.IgnoreKanaType) ==0)
textBox1.Text = “同じ”;
else
textBox1.Text = “違う”;

——————————————————————–

2017年4月6日

松本 吉生(まつもとよしお)
Microsoft MVP Data Platform

1961年京都に生まれ、神戸で幼少期を過ごす。大学で応用化学を学んだのち、理科教諭として高等学校に勤務する。教育の情報化が進む中で校内ネットワークの構築運用に従事し、兵庫県立明石高等学校で文部科学省の「光ファイバー網による学校ネットワーク活用方法研究開発事業」に携わる。兵庫県立西宮香風高等学校では多部制単位制の複雑な教育システムを管理する学籍管理データベースシステムをSQL ServerとInfoPath、AccessなどのOfficeソフトウエアによるOBA開発で構築・運用する。現在は兵庫県立神戸工業高等学校でC#プログラミング、IoTなどのコンピュータ教育を行う。2004年からマイクロソフトMVP(Microsoft Most Valuable Professional)を受賞し、現在14回目の連続受賞。2016年にマイクロソフト認定教育者(Microsoft Innovative Educator Experts : MIEE)を受賞。

C# – 文字列を比較する(3)– System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスの System.Globalization.CompareOptions の IgnoreWidth オプションでカタカナの全角と半角を同じに評価する。

leave a comment »

文字列を比較するとき、System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスを使うと日本語固有の評価を変えることができる。たとえば System.Globalization.CompareOptions の IgnoreWidth オプションを使うと、カタカナの全角と半角を同じに評価することができる。

まず、IgnoreWidth オプションを使わない評価をする。System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスが返す値は int 型で、文字列が同じときは「0」、異なるときは「-1」を返す。次の例では「違う」という評価がされる。

——————————————————————–

string a = “アイウエオ”;
string b = “アイウエオ”;
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare(a, b)==0)
textBox1.Text = “同じ”;
else
textBox1.Text = “違う”;

——————————————————————–

次に System.Globalization.CompareOptions の IgnoreWidth オプションを使ったコードを示す。こちらでは「同じ」という評価を得る。

——————————————————————–

string a = “アイウエオ”;
string b = “アイウエオ”;
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare
(コードの続き)(a, b,System.Globalization.CompareOptions.IgnoreWidth)==0)
textBox1.Text = “同じ”;
else
textBox1.Text = “違う”;

——————————————————————–

このように System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスは多言語の特性に対応しており、日本語特有の評価を行うことができる。

2017年4月6日

松本 吉生(まつもとよしお)
Microsoft MVP Data Platform

1961年京都に生まれ、神戸で幼少期を過ごす。大学で応用化学を学んだのち、理科教諭として高等学校に勤務する。教育の情報化が進む中で校内ネットワークの構築運用に従事し、兵庫県立明石高等学校で文部科学省の「光ファイバー網による学校ネットワーク活用方法研究開発事業」に携わる。兵庫県立西宮香風高等学校では多部制単位制の複雑な教育システムを管理する学籍管理データベースシステムをSQL ServerとInfoPath、AccessなどのOfficeソフトウエアによるOBA開発で構築・運用する。現在は兵庫県立神戸工業高等学校でC#プログラミング、IoTなどのコンピュータ教育を行う。2004年からマイクロソフトMVP(Microsoft Most Valuable Professional)を受賞し、現在14回目の連続受賞。2016年にマイクロソフト認定教育者(Microsoft Innovative Educator Experts : MIEE)を受賞。