C# の var におけるメリット・デメリット


C# 3.0 から導入された var。これは積極的に使うべきか、使うべきでないかでしばしば論争が繰り広げられる。

static クラスの、自身のクラス名を取得する。

通常のクラスであれば、自身のクラス名取得は簡単だ。
this.ToString();
ところが static クラスについては this と打った瞬間にこんな残念なエラーとなってしまう。
割り当て、呼び出し、インクリメント、デクリメント、待機、および新しいオブジェクトの式のみがステートメントとして使用できます
以下のように取得する方法がある。
// クラス名は ConsoleApplication1。
Type me = new System.Diagnostics.StackFrame().GetMethod().DeclaringType;
// ConsoleApplication1.Program
string className2 = me.ToString();

AsEnumerable() が使えない

DataTable の定義にない

古いソース(.NET Framework 2.0 時代のもの)を改修する場合によくあるのだが、AsEnumerable メソッドは拡張されたメソッドであるため、プロジェクトの参照設定で System.Data.DataSetExtensions アセンブリを追加しなければならない。

アセンブリの追加を行えば、インテリセンスにも表示されるようになる。

DataTableExtensions.AsEnumerable メソッド - msdn
https://msdn.microsoft.com/ja-jp/library/system.data.datatableextensions.asenumerable%28v=vs.110%29.aspx

MultiLine TextBox の Length は改行込みの長さ

ASP.NET の TextBox を MultiLine に設定すると、以下のような挙動となる。

TextBox1.Text.Length

長さを取ろうとすると、テキストボックス内の改行を含めた長さを返す。
このような入力を行うと、TextBox1.Text.Length の戻り値は 7 となる。改行コードもカウントされているためだ。

TextBox の行数を取得

改行コードは機種によって依存するのだが、以下のような方法で行数を取得できる。
int linage = TextBox1.Text.Split(new string[] { Environment.NewLine }, StringSplitOptions.None).Length;
// 改行がなくても 1 のため。
linage--;
Length で取得した文字数から行数を引けば、文字数のみ修得することができる。

DataTable の特定行を ラムダ式で検索・削除

DataTable の検索と削除

DataTable が未だに残っているシステムは多く、表題の表な細かい要望も作りによってはある。行を抽出するためには Select メソッドがあるが、これは場合によっては遅いので、改修するならラムダ式で検索し、その行を削除する書き方をしたほうが良い。
DataTable dt = new DataTable();
dt.Columns.Add("ProductCd", typeof(string));
DataRow dr1 = dt.NewRow();
dr1["ProductCd"] = "HGE-10";
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2["ProductCd"] = "HOG-20";
dt.Rows.Add(dr2);
DataRow dr3 = dt.NewRow();
dr3["ProductCd"] = "HGH-20";
dt.Rows.Add(dr3);

DataRow[] dr = dt.AsEnumerable().Where(x => x.Field<string>("ProductCd").EndsWith("10")).ToArray();
// この書き方も可能。
//Array.ForEach(dr, r => dt.Rows.Remove(r));
foreach (DataRow r in dr)
{
 dt.Rows.Remove(r);
}