C# Switch拡張メソッド

C#のswitchステートメントって不便ですよね。古くさいというか。
戻り値が返せなかったり、複雑な条件が指定できなかったり。

ですので、Switch拡張メソッドを作ってみました。

たとえばint型変数valueの値によって文字列を返す場合、以下のように使用します。
var str = value.Switch()
.Case(0, “0です。”)
.Case(x => x > 0, “プラスです。”)
.Default(“マイナスです。”);

たとえば変数valueの値によって何らかの処理を行う場合、以下のように使用します。
value.Switch()
.Case(0, x => {
//0の場合の処理
}).Case(x => x > 0, x => {
//プラスの場合の処理
}).Default(x => {
//マイナスの場合の処理
});

Switch拡張メソッドはobject型の拡張メソッドになっており、CaseメソッドやDefaultメソッドなどをメンバに持つSwitch処理用のクラスを返すようになっています。

ナチュラルソート

最近のWindwosのエクスプローラは、ファイル名のソート方法が今までと異なっています。

以前は単純にソートしているだけでしたが、最近はファイル名内の数値の個所を数値して認識してソートを行っています。
その結果、連番が付いているファイルなどを自然な順番でソートできています。

このソート方法はナチュラルソートと言われるらしく、ネットで調べると参考ソースコードもいくつか見つかりました。

今後、必要な場面が間違いなく有りそうなので、社内ライブラリに追加したいと考えています。

C# 継承元で継承先の型を使用したい

C#では、継承元で継承先の型を使用することが言語レベルではサポートされていません。これはクローンメソッドなどを作成する場合に不便です。

以下のようにジェネリックを使用することで同等のことが一応行えるようになります。

//継承元クラス
abstract class ClassA<TClass> where TClass : ClassA<TClass>, new() {
 public abstract TClass Clone();
}

//継承先クラス
class ClassB : ClassA<ClassB> {
 public int Value { get; private set; }

 public override ClassB Clone() {
  ClassB obj = new ClassB();
  obj.Value = Value;
  return obj;
 }
}

この場合、継承先クラスの型を知るためにTClassを使用しています。TClassの制約にClassA<TClass>が入っているので、ClassA<TClass>を継承したクラスしかTClassに使用できなくなっています。

同等のことが実現できましたが、見た目がシンプルでは無いですね。やはり言語レベルで何とかして欲しいところです。なお、アップルのSwift言語にはこの機能が実装されているそうです。

Project 2013

VISIO2013に続けてProjectも2013に変更しました。
いままではProject2000を使用していました。

Project2000はバグでタスクがうまく動かない場合があったり、Windows7以降のOSでは起動時にヘルプが必ず表示されたりエラーが出たり、何かと不満が多かったのですが、代わりになるソフトが他に無く使い続けていました。
Project2013はそのような問題はなく快適に使用できています。

やはりソフトは新しいほうが良いですね。

VISIO 2013

VISIOを2013に変更しました。
いままでは2003を使用していたので10年ぶりの更新です。

最近はUML図をastahで作成していたので、VISIOの使用頻度は下がっていましたが、
それでも無いと困るので新しくしました。

他のOffice製品と同じようにリボンUIになっており、使いやすそうではあります。
図形が今風のシンプルなデザインになってますね。最初はどうかなと思いましたが、仕様書に貼り付けても違和感なく、むしろスッキリして見やすいと感じました。

やはりソフトは新しいほうが良いですね。

C#で文字列式を演算する

文字列の式を演算したいと思う場合が結構あります。

DataTable.Compute()メソッドで実現できることが分かったので、実装して見ました。

以下が作成したメソッドです。string型の拡張メソッドになっています。
public static T Calc<T>(this string s, params object[] args) {
 using (DataTable dt = new DataTable()) {
  s = string.Format(s, args);
  object result = dt.Compute(s, “”);
  var converter = TypeDescriptor.GetConverter(typeof(T));
  return (T)converter.ConvertFromString(result.ToString());
 }
}

以下のように使うと、(2+4)/2の数値演算を行い、3を返します。
var value = “({0} + {1}) / 2″.Calc<double>(2,4);

以下のように使うと、2>=4の論理演算を行い、falseを返します。
var value = “{0} >= {1}”.Calc<bool>(2,4);

簡単ですね。

34インチウルトラワイドモニタ

DELLが販売している34インチウルトラワイドモニタU3415Wがほしくてたまらない。

仕事ではデュアルモニタを使用しているが、つなぎ目が気になる、輝度や色相の差が気になる。 解像度も現状の2つのモニタを足したサイズよりも大きい。ウルトラワイドでも(多分)見やすい曲面スクリーン。

しかし、金額が10万円! 高すぎるよ。

親子

先日、息子(小学生)の日曜参観日に行ってきました。

算数の授業で、図形の面積を求める問題について、複数の解き方があるのでクラス全員で
色々な解き方を出し合う授業でした。

授業を見ながら自分ならどう解くかを考えていると、息子もほぼ同じ方法で解いていました。

息子は嫁よりも自分に似ているが、計算の仕方まで同じとはビックリです。

10年前のソフト

保守のために自分が10年前に作成したソースコードを読んだのですが、非常に読みづらい。
.NET Frameworkは出始めのバージョン1.1です。

.NET Frameworkの機能も貧弱だったので仕方が無い所もあるものの、名前の付け方や実装の方法が.NETの作法から外れていたり古くさかったり、残念なソースコードになっていました。

10年の間に.NETも自分も成長したのだと、ポジティブに考えることにします。

C#7のタプル

C#7の新機能の話です。

言語レベルでタプルに対応するそうです。なお、System.Tupleとは関係がありません。
ざっくり言うと、メソッドの引数や戻り値、プロパティの型などに匿名型が使える様になります。

System.Tupleを使った場合も汎用の型として同様のことが行えますが、System.TupleはメンバへのアクセスがItem1やItem2のようにメンバの意味が分かる名称で無いため、可読性が悪くあまり使いたい機能では無かったです。

タプルを使用した戻り値は以下のようなコードになります。

public (int sum, int count) Tally(IEnumerable values) { … }

var t = Tally(myValues);
Console.WriteLine($”Sum: {t.sum}, count: {t.count}”);

Tallyメソッドの戻り値がsumとcountの2つになっています。
引数と同じように括弧で囲って複数記載できるようになっています。

Tallyメソッドの呼び出し側は、戻り値を変数tに代入しています。
tは、sumとcountメンバを持つ匿名メソッドのようになっています。

この機能追加によって、out引数を使用したり、戻り値専用に一時格納用クラスを定義する必要がなくなり、シンプルで可読性の高い実装になりそうです。