2013/02/28

[C#] ラムダ式はデリゲート型ではないため、型 ´ ´ に変換できません。

いろいろな理由があるのだが、名前空間がない場合もこのエラーが出る場合がある。
まず、System.Linq 名前空間がインポートされているかチェックしよう。
u sing System.Linq;

また、System.Linq 名前空間は、System.Core アセンブリ (System.Core.dll) に含まれているそうだ。

System.Linq 名前空間 - msdn
http://msdn.microsoft.com/ja-jp/library/vstudio/system.linq.aspx

2013/02/25

[C#] テキストボックスで「Ctrl + c」や「Ctrl + v」のイベントを処理する。


コピーやペーストを禁止したい場合、別の処理を追加しなければならないが、
テキストボックスのショートカットキーを拾うだけなら KeyDown イベントを追加する。
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
  if (e.KeyData == (Keys.Control | Keys.C))
  {
    // Ctrl + C
    toolStripStatusLabel1.Text = "Ctrl + C が押されました。";
  }
  else if (e.KeyData == (Keys.Control | Keys.V))
  {
    // Ctrl + V
    toolStripStatusLabel1.Text = "Ctrl + V が押されました。";
  }
}

2013/02/21

[Windows Update] KB とは。


Windows Update でインストールされるプログラムには、頭に "KB" という記号が付いている。
KB とは、Knowledge Base のことらしい。

Microsoft のサポートで検索する方法があるのだが、
検索窓から KB 番号を入れても検索されるのは一部のものだけのように見える。

「サポート技術情報」 (Microsoft Knowledge Base) の検索方法に関するヒント | support.microsoft.com
http://support.microsoft.com/kb/242450/ja#12

2013/02/20

[C#] List の Contains とラムダ式による検索

List の中にある値が含まれているかどうかというチェックに関しては、
List の Contains を使えば良い。

しかし、ある値に List に定義された値が含まれているか、という逆のチェックは
List(T).Contains メソッドではチェックできない (そもそも期待する結果にならない)。

これを実現するには、foreach 等でリストを回してチェックすることを思いつくのだが、
ラムダなら 1 行で済む。
 var input = " I'd like to have some orange juice.";
 var fruits = new List { "apple", "orange", "banana", };

 var result1 = fruits.Contains(input);
 Debug.WriteLine(result1);

 var result2 = fruits.Exists(w => input.Contains(w));
 Debug.WriteLine(result2);

 var result3 = false;
 foreach (var x in fruits)
 {
     if (input.Contains(x))
     {
         result3 = true;
         break;
     }
 }
 Debug.WriteLine(result3);

 // 結果
 // result1 = false
 // result2 = true
 // result3 = true

2013/02/19

[C#] Enum の存在チェックは奥が深い。

ある値が、Enum に含まれているかどうかのチェックには色々な方法があるのだが、回すやり方が速いようだ。少々意外な結果である。
class Program
    {
        enum MyEnum { a = 0, b, c }
        private const int loop = 10000000;

        static bool IsDefined(MyEnum myEnum)
        {
            var b = false;
            switch (myEnum)
            {
                case MyEnum.a:
                case MyEnum.b:
                case MyEnum.c:
                    b = true;
                    break;
            }
            return b;
        }

        static void Main(string[] args)
        {
            var sw = new Stopwatch();

            // Enum.IsDefined
            sw.Start();
            for (int i = 0; i < loop; ++i)
            {
                Enum.IsDefined(typeof(MyEnum), 0);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);

            // 泥臭い ? やり方
            sw.Reset();
            sw.Start();
            for (int i = 0; i < loop; ++i)
            {
                IsDefined((MyEnum)0);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);

            // TryParse
            sw.Reset();
            sw.Start();
            for (int i = 0; i < loop; ++i)
            {
                var myEnum = new MyEnum();
                var b = Enum.TryParse("0", out myEnum);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);

            // 強引に LINQ を使う
            sw.Reset();
            sw.Start();
            for (int i = 0; i < loop; ++i)
            {
                Enum.GetValues(typeof(MyEnum)).Cast().Contains((MyEnum)0);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);

            /*
             * 2544
             * 126
             * 4603
             * 26415
             */

        }

    }
あとは、IsDefined のパフォーマンスが悪いという話をよく目にするが、実際はそれほど問題になるようなことはないと思う。それならソースの見通しを良くしておいた方がいいかな、というのが持論。

2013/02/18

[C#] 内部例外とは

詳細については、内部例外を参照してください。

内部例外というのは、InnerException の事であり、
例外のさらに前で発生した例外 (つまり原因となる例外) を意味する。

内部例外が発生していない場合はこの値は null (VB の場合は Nothing) になる。

2013/02/17

[Windows] ドラッグアンドドロップの「コピー」と「移動」の違い


Windows の仕様では、コピー元のファイルがどこにあるか、そして、ドラッグアンドドロップ先のフォルダのドライブがどこであるかによって挙動が変わる。

通常、ドラッグアンドドロップ先が同一ドライブの場合は「移動」が行われ、別ドライブの場合は「コピー」が行われる。
また、キーボードから挙動を固定することもできる。

ファイルの移動 : Shift & ドラッグアンドドロップ

ファイルのコピー : Ctrl & ドラッグアンドドロップ

Windows 7 なら、どちらの挙動になるのかツールヒントが表示され、
移動なのかコピーなのか表示されるようになっている。

2013/02/12

[Windows 8] 英語キーボードでハマる。

Windows 8 は IME に色々と癖があるようだ。
使い始めた瞬間に困惑したw

Windows 8 では、IME のオンとオフが、システム全体で保持されているらしい。
なんという仕様……。

Windows 8のIMEのオン/オフをアプリごとに制御する - @IT
http://www.atmarkit.co.jp/ait/articles/1212/14/news050.html

日本語入力のオンとオフ - Microsoft
http://windows.microsoft.com/ja-JP/windows-8/ime-enable-help

英語キーボードの場合、
IME オン・オフは 「Alt」 & 「~」 (日本語キーボードでは半角/全角があるキー) である。


IME の種類は、「Windows キー」 + 「スペース」 で切り替えられるようになった。
これは良い。あまり切り替えないかもしれないが……。

2013/02/08

[C#] GUID 形式を正しく理解していないとハマる。


GUID には、ハイフンを 4 つ含む 32 桁の数字 (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) を含んでいなければなりません。

GUID とは。
  • 16 進表記である。
  • 32 桁である。
変換できないエラーの場合、桁数を指摘しているのだが、このサンプルで何がまずいって、
16 進表記ではないアルファベットが使用されている部分。
つまり、数字の 0 ~ 9 と a, b, c, d, e, f のみしか使えないのだ。
当たり前だろ、って思うかもしれないが (笑)。

C# から PowerShell へ値を渡し、コマンドレットを実行した場合、C# 側に帰ってくるエラーが上記の例ではない場合がある。サンプルデータなどを自分で加工した場合に、この点を注意しておかないと意味不明なエラーで悩まされるのだ。
→ このオブジェクトにプロパティ '' が見つかりません。プロパティが存在し、設定可能なことを確認してください。

2013/02/07

[PowerShell] 条件式の比較演算子

PowerShell の比較演算子で、とりあえずよく使いそうなものはこんな感じである。

比較演算子 意味
-eq 等しい ==
-ne 等しくない !=
-gt より大きい >
-lt より小さい <
-ge 以上 >=
-le 以下 <=
-like あいまい (ワイルドカードは 「*」)
-nolike あいまい (ワイルドカードは 「*」)

2013/02/06

[PowerShell] PowerGUI で .NET アセンブリのインテリセンス。


PowerShell は .NET のアセンブリにフルアクセスできるので、
活用次第ではかなりのパワーを発揮する。
で、PowerGUI で .NET アセンブリを使う際にインテリセンスを出したいと思ったのだが、
普通に「. (ドット)」を打つだけでは候補が出てこなかった。


調べてみると、どうやらカッコで括ると表示されるらしい。
http://www.powergui.org/thread.jspa?threadID=15383

アセンブリによっては名前空間を省略することもできるようだ。

2013/02/05

[らじる☆らじる] NHKネットラジオのアプリが良いね。



NHK のネットラジオは PC からも聴けるのだが、スマートフォン向けにアプリも用意されている。
これがかなりいい。

Android 用 NHK ネットラジオ らじる★らじる - Google play
iOS 用 NHK ネットラジオ らじるらじる - iTunes


オフタイマー設定と予約機能が当然のように実装されており、
夜はラジオを流しながら寝れるし、朝は番組の予約をセットしておけば目覚まし代わりにもなる。
語学講座等には最適だ。


予約機能のこだわりがすごいw

2013/02/04

[C#] 規定のコードスニペット。生産性を上げる修練。



コードスニペットを使いこなしている人と全く使っていない人では、その生産性に差が出るほどであると思う。バリバリ使いこなしている人は自分で定義までしているかもしれないが、規定のものを使うだけでもだいぶ楽になる。
規定でどういうキーワードがあったのか、一覧はここにあった。

規定のコードスニペット - msdn

たいていのものはインテリセンスから挿入できるので、
Ctrl + J でインテリセンスを表示。キーワード入力 → Tab で良い。

ただ、#region などはキーワード入力からは挿入できない (# を入力するとインテリセンスが消える)。
この場合、Ctrl + K & Ctrl + X でコード スニペット インサータを表示させて、
コードスニペットを選択するという手間がかかる。


一応キーボードで選択できるので、#region の場合は、
Ctrl + K & Ctrl + X → v →Enter
と、入力すれば良い。

自分で入力したほうが楽かもしれないが、手が覚えてしまえば早いのではないだろうか。
Related Posts Plugin for WordPress, Blogger...