拡張メソッドを使ってみる

拡張メソッドを使ってみたかったので、ちょっと遊んでみます。

以前、LINQを利用して、読みやすいコードを書くサンプルとして以下のようなコードを提示していました。

class 在庫計
{
public int 数量計 { get; set; }
public int 金額計 { get; set; }
}
public class サンプル
{
public void サンプルメソッド(在庫[] 在庫リスト)
{
Func<在庫, bool> 集計対象 = 在庫情報 =>
{
if (在庫情報.数量 <= 10)
{
return false;
}
if (在庫情報.数量 % 1000 != 0)
{
return false;
}
return true;
};
var 在庫計情報 = 集計(在庫リスト,集計対象);
System.Windows.Forms.MessageBox.Show(string.Format("数量計 = {0},金額計 = {1} ", 在庫計情報.数量計, 在庫計情報.金額計));
}
private 在庫計 集計(在庫[] 在庫リスト,Func<在庫,bool> 集計対象)
{
在庫計 在庫計情報 = new 在庫計();
在庫計情報.数量計 = 在庫リスト
.Where(集計対象)
.Sum(x => x.数量);
在庫計情報.金額計 = 在庫リスト
.Where(集計対象)
.Sum(x => x.金額);
return 在庫計情報;
}
}

集計メソッドで在庫リストにある数量と金額の合計を作成するわけですが、集計メソッドに在庫リストと抽出条件を引数で渡しているだけなので、特に在庫リストに結びついた処理であるといった情報はありません。

そこで拡張メソッドを利用したサンプルを書いてみます。

class 在庫計
{
public int 数量計 { get; set; }
public int 金額計 { get; set; }
}
class サンプル
{
public void サンプルメソッド(在庫[] 在庫リスト)
{
Func<在庫, Boolean> 抽出条件 = 在庫情報 =>
{
if (在庫情報.数量 <= 10)
{
return false;
}
if (在庫情報.数量 % 1000 != 0)
{
return false;
}
return true;
};
var 在庫計情報 = 在庫リスト.集計(抽出条件);
System.Windows.Forms.MessageBox.Show(string.Format("数量計 = {0},金額計 = {1} ", 在庫計情報.数量計, 在庫計情報.金額計));
}
}
static class 在庫処理拡張サンプル
{
public static 在庫計 集計(this 在庫[] 在庫リスト, Func<在庫, Boolean> 抽出条件)
{
在庫計 在庫計情報 = new 在庫計();
var result = from 在庫情報 in 在庫リスト
where 抽出条件(在庫情報)
select 在庫情報;
在庫計情報.数量計 = result.Sum(x => x.数量);
在庫計情報.金額計 = result.Sum(x => x.金額);
return 在庫計情報;
}
}

この例の場合、在庫リスト.集計とコーディングできるため、「在庫リストの集計」と読むことができて、より文脈に沿ったコードを書くことができるようになりました。

まぁ、在庫リストなんて在庫の配列があるかといえば、だいたいにおいて在庫テーブルにアクセスするクラスがあって、そこに集計メソッドがあれば済む話なので拡張メソッドを利用する事は無いし、あまり多用するものでもないのですが、今回の例みたいに

「特定の配列に処理を追加したい。」

なんてときには便利かもしれません。

Share

LINQのGroupJoinを使ってみる

LINQに普通のJoinのほかにGroupJoinという機能がありますので、ちょっと使って遊んでみました。

通常のJoinの場合

var 商品リスト = new[] { new { 商品番号 = "A", 商品名 = "鼻毛カッター" },
new { 商品番号 = "B", 商品名 = "安全ハサミ" },
new { 商品番号 = "C", 商品名 = "ラジオペンチ"}};
var 在庫リスト = new[] { new { 商品番号 = "A", 数量 = 30 ,LotNo = 1} ,
new { 商品番号 = "A", 数量 = 40 ,LotNo = 2} ,
new { 商品番号 = "A", 数量 = 50 ,LotNo = 3} ,
new { 商品番号 = "A", 数量 = 60 ,LotNo = 4} ,
new { 商品番号 = "A", 数量 = 70 ,LotNo = 5} ,
new { 商品番号 = "A", 数量 = 90 ,LotNo = 6} ,
new { 商品番号 = "A", 数量 = 80 ,LotNo = 7} ,
new {商品番号 = "C",数量 = 69,LotNo = 8}};
var 商品別LOTNO別リスト = from 商品 in 商品リスト
join 在庫 in 在庫リスト
on 商品.商品番号 equals 在庫.商品番号
select new
{
商品番号 = 商品.商品番号,
商品名 = 商品.商品名,
LOTNO = 在庫.LOTNO,
数量 = 在庫.数量
};

というように二つの匿名型の配列を商品番号で結合したときの結果は

var 商品別LOTNO別リスト = new[] { new { 商品番号 = "A", 商品名 = "鼻毛カッター", 数量 = 30 ,LotNo = 1} ,
new { 商品番号 = "A", 商品名 = "鼻毛カッター", 数量 = 40 ,LotNo = 2} ,
new { 商品番号 = "A", 商品名 = "鼻毛カッター", 数量 = 50 ,LotNo = 3} ,
new { 商品番号 = "A", 商品名 = "鼻毛カッター", 数量 = 60 ,LotNo = 4} ,
new { 商品番号 = "A", 商品名 = "鼻毛カッター", 数量 = 70 ,LotNo = 5} ,
new { 商品番号 = "A", 商品名 = "鼻毛カッター", 数量 = 90 ,LotNo = 6} ,
new { 商品番号 = "A", 商品名 = "鼻毛カッター", 数量 = 80 ,LotNo = 7} ,
new {商品番号 = "C",, 商品名 = "ラジオペンチ", 数量 = 69,LotNo = 8}};

というように、SQLでINNER JOINをする時と同じような結果になります。

つまり、商品リストの商品番号に対して在庫リスト中に同じ商品番号があれば、それだけオブジェクトが作られます。

もちろん、対象の商品番号が無かったオブジェクトは作られません。

大して、

var 商品リスト = new[] { new { 商品番号 = "A", 商品名 = "鼻毛カッター" },
new { 商品番号 = "B", 商品名 = "安全ハサミ" },
new { 商品番号 = "C", 商品名 = "ラジオペンチ"}};
var 在庫リスト = new[] { new { 商品番号 = "A", 数量 = 30 ,LotNo = 1} ,
new { 商品番号 = "A", 数量 = 40 ,LotNo = 2} ,
new { 商品番号 = "A", 数量 = 50 ,LotNo = 3} ,
new { 商品番号 = "A", 数量 = 60 ,LotNo = 4} ,
new { 商品番号 = "A", 数量 = 70 ,LotNo = 5} ,
new { 商品番号 = "A", 数量 = 90 ,LotNo = 6} ,
new { 商品番号 = "A", 数量 = 80 ,LotNo = 7} ,
new {商品番号 = "C",数量 = 69,LotNo = 8}};
var 商品別在庫リスト = from 商品 in 商品リスト
join 在庫 in 在庫リスト
on 商品.商品番号 equals 在庫.商品番号 into 商品別在庫
select new
{   商品番号 = 商品.商品番号,
商品名 = 商品.商品名,
数量 = 商品別在庫.Sum(x => x.数量)
};
foreach (var 商品別在庫 in 商品別在庫リスト)
{
Console.WriteLine(string.Format("商品番号:{0} 商品名:{1} 在庫数量:{2}",
商品別在庫.商品番号,
商品別在庫.商品名,
商品別在庫.数量));
}

Join … Intoという構文で上記のようにGroupJoinをすると、

var 商品別在庫リスト = new[] { new { 商品番号 = "A", 商品名 = "鼻毛カッター" ,数量 = 420},
new { 商品番号 = "B", 商品名 = "安全ハサミ" ,数量 = 0},
new { 商品番号 = "C", 商品名 = "ラジオペンチ",数量 = 69}};

というように、商品リストの商品番号と同じ商品番号の在庫は集約されて結合されますので、商品番号単位に在庫リストが作成されることになり、商品番号別の数量の合計を出力する事が可能です。

また、在庫リストに対象の商品番号が無いオブジェクトも作られます。

Share

諦める前に後悔したほうが良い

「後悔先に立たず」

という言葉があるように、後悔したところですでに過ぎてしまったものを無かったことにはできないが、だからといってすぐに諦める必要は無い。

ここは一旦、後悔しておくのだ。

後悔するということは、自分の過去の行動を否定することである。

これが何を意味するのかというと、「改善するためのタイミング」になるということだ。

自分の過去の行動を否定しないでただ諦めてしまうだけであれば、その後、何も産み出すことは無いが、後悔することで「改善するためのタイミング」を作れば、その後の自分にとって何らかのプラスになるはずである。

たとえば、

「学生時代、もっと勉強しておけばよかった。」

と後悔することで、「勉強が足りなかった。」と自分の過去を否定し、「今からでも勉強したら良いのでは?」というタイミングができる。

もし、

「学生時代、勉強してなかったんだから仕方ないよね。」

と諦めてしまうと、そこで何も産まないで終わってしまうのである。

以上の理由で、諦めてしまう前に一度後悔する事を、お勧めします。

まぁ、適用できない後悔もたくさんありますが・・・。

Share

うざい投稿に「うざい」と投稿する心理

技術系の掲示板(まぁ、@ITなんだけど)を見ているとたまに、うざい投稿や規約違反の投稿がある。

掲示板自体は、スレッドに対して回答しなければ、スレッドの海に沈んでいく仕様となっている。

なので、そのまま放置するか、サポート用のスレッドに規約違反の投稿があった旨を報告するくらいだ。

ちょっと考えれば、うざい投稿に「うざい」と投稿してスレッドを上げることで、他の閲覧者に該当のスレッドを晒すことで「うざい」気持ちが伝播していくと分かると思うのだが、その手の投稿も結構多い。

まぁ、つまり

うざい投稿に「うざい」と投稿する。その投稿自体もまたうざい。

のである。

そこで、なんで、いちいちそんな投稿をするのか適当に想像してみた。

1.直情的で、他の閲覧者のことまで考えが及ばない。良くいえば素直。

2.「うざい」スレッドがここにありますよ。とあえて他の閲覧者に広告することで、同じ気持ちを共有したい。と思っている。

3.投稿者に「そういう投稿はうざいですよ。」と親切心から投稿している。閲覧者のことまでは考えが及んでいない。

4.「うざい」投稿をした投稿者を断罪したい。自分は正義感に溢れていると思っている。

Share

マイクロソフトのハードウェアサポート後日談

とりあえず、家に帰って検証してから、故障窓口に電話しないと・・・。

定時内しかつながらないから、家に帰ってまた、いろいろとメモを取って職場で電話しないといけないのですね。

オンライン受付してほしいよ。

NAL-6295の舌先三寸 – やっと見つけたと思った電話番号ではだめだった

検証してから、故障窓口に電話して交換してもらえる事になったのだが、保証書をFAXしないといけない。

自宅にFAXはないので、まだ送っていないのだが、困ったな。

コンビニかな。

とりあえず、交換してもらえることになってよかった。

Share

ラムダ式と匿名型:VBとC#で出来ることの違い

C#は、式だけではなく、メソッドのように{}で囲った中にステートメントを書ける。

VBは、式だけしか書けない。

この違いは結構大きい。

匿名型に関していえば、

C#は、宣言時に初期化した内容を書き換えることができない。(ReadOnly)

VBは、宣言時に初期化した内容を書き換えることができる。書き換えたくない場合はkeyキーワードでReadOnlyにできる。

この違いも結構大きい。

いいとこ取りしたいなぁ。

Share
カテゴリー: .NET

やっと見つけたと思った電話番号ではだめだった

先日購入した、マイクロソフト製のキーボードを修理に出したくて、一所懸命マイクロソフトのサイトで修理に出すためのコンタクト先をさがした。

それにも、かなり時間がかかって、NとMの押下時のセンサが鈍いだけだからあきらめようかというところでやっと見つけた。

なんで、このご時世、電話だけでしか受け付けてないのか。

しかも、平日定時内。

NAL-6295の舌先三寸

プロダクトレジストレーションセンターに書いてある問い合わせ先の中に、ハードウェアの故障とあったので、電話してみたら、「その手の依頼は取り扱っていない」といわれてしまった。そして、教えてもらった電話番号はフリーダイヤルじゃない。どうも、一度サポートに電話して故障が確定したら修理ではなく交換という手続きになっているらしい。

教えてもらった電話番号を後で調べてみたら、サイト上はオフィスの無償サポートの電話番号なんだよね。

わかりづらいなぁ・・・。

Share

やっと見つけたと思った製品別サポートもだめだった

キーボード

マイクロソフト インターネット キーボード

マイクロソフト オプティカル デスクトップ ウィズ フィンガープリント リーダー

マイクロソフト オプティカル デスクトップ エリート フォー ブルートゥース

マイクロソフト ヘルプとサポート

電話が混んでいて、自動アナウンスでサポートのページでも問い合わせられると言っていたので、探してみた。

どうも、ここから製品別サポートのページに飛べという話みたいなんだけど、まだ、この製品へのリンクが存在しない・・・。

発売されてから、もう1ヶ月経とうとしているんだけどなぁ・・・。

追記:

電話がつながって、いろいろと聞いてみたら、ハードウェア製品は電話でのみの受付らしいという事がわかった。

また、故障かどうかの切り分けができるまでは、フリーダイヤルじゃない方に電話してからじゃないと、故障の受付をしてくれないという事もわかった。

そのわりにプロダクトレジストレーションセンターには故障の窓口への電話番号しか書いていないんだよね・・・。

なんと不親切な・・・。

こうやって、実際に故障してから、故障した製品の交換にたどりつくまでに人数を絞って、コストを削減しているのかと、穿ったみかたもしたくなる。

とりあえず、家に帰って検証してから、故障窓口に電話しないと・・・。

定時内しかつながらないから、家に帰ってまた、いろいろとメモを取って職場で電話しないといけないのですね。

オンライン受付してほしいよ。

Share

なぜ、修理の依頼を電話でしか受け付けていないのだ。

先日購入した、マイクロソフト製のキーボードを修理に出したくて、一所懸命マイクロソフトのサイトで修理に出すためのコンタクト先をさがした。

それにも、かなり時間がかかって、NとMの押下時のセンサが鈍いだけだからあきらめようかというところでやっと見つけた。

なんで、このご時世、電話だけでしか受け付けてないのか。

しかも、平日定時内。

せめて、メールでも受け付けてくれてよいと思うし、欲を言えばというか、Windows LiveIDを登録してユーザ登録させるくらいなんだから、ユーザ登録のページ経由で修理の受付をしてくれても良いのではないかと思う。

なんのためのユーザ登録だよ。まったく。

EPSONなんかは、ユーザ登録経由で修理の受付もしてくれたし、一切電話を利用しないで全て片付いた。

もうちょっと、売った後のことも考えてほしいし、今後ハードウェアを売って行くつもりがあるのなら考える必要があるだろう。

修理に出すつもりのキーボードとマウスのセットは、会社と自宅用に2セット購入するくらい良いものなのに・・・。

Share