C#

手っ取り早い方法はTaskクラスを使う。

        public Task<int> TestAsync()
        {
            return Task.Run<int>(async () =>
            {
                // ↓このループは時間のかかる処理のつもり
                for (int i = 0; i < 10; i++)
                {
                    Debug.WriteLine(i);
                    await Task.Delay(1000);
                }
                return 123;
            });
        }

        private async void button_Click(object sender, RoutedEventArgs e)
        {
            int ret = await TestAsync();

            await new MessageDialog(ret.ToString()).ShowAsync();
        }

詳しくは、

連載:C# 5.0&VB 11.0新機能「async/await非同期メソッド」入門(最終回):第3回 非同期メソッドの内部実装とAwaitableパターンの独自実装 (2/2) - @IT

に書かれている。

実際のところは、時間のかかる処理は別スレッドで動かすと思うんでTask.Runを使う方法でいいと思う。



このエントリーをはてなブックマークに追加 Clip to Evernote
ブログランキング・にほんブログ村へ
にほんブログ村

クラスの継承とかせずに見かけ上メソッドを追加する機能だ。見かけ上ってのは使う側のコードがインスタンスメソッドを呼ぶときと同じように書けるとういこと。拡張メソッド中ではプライベートなメンバが使えない。

stringにHoge()と言うメソッドを追加してみよう。(なんかいい感じの追加したいメソッドが思い浮かばなかった(^^;))

拡張メソッドの最初の引数に拡張したいクラスと引数名、その頭にthisを付けておく。

    public static class ExtensionString
    {
        public static String Hoge(this String str)
        {
            return "###" + str;
        }
    }

使う側は普通にインスタンスメソッドを呼ぶのと同じようにする。

            string str = "あいうえお";
            Debug.WriteLine(str.Hoge());

この拡張メソッドが有効な範囲は同じネームスーペスで違う場合は、usingで指定しておくと使えるようになる。



このエントリーをはてなブックマークに追加 Clip to Evernote
ブログランキング・にほんブログ村へ
にほんブログ村

LINQの拡張メソッド一覧と、ほぼ全部のサンプルを作ってみました。 - 地平線に行く


ありがたや〜w
わかりやすく、まとまってます。Microsoftのヘルプだとほしいメソッドが探しにくかったんだよな。


このエントリーをはてなブックマークに追加 Clip to Evernote
ブログランキング・にほんブログ村へ
にほんブログ村

[C#] Linqと再帰でファイルの一覧表示(2)のLinqのクエリ式をメソッド構文で書き直してみた。

Func<DirectoryInfo, IEnumerable<string>> FileListUp = null;	// (1)こうしておかないとエラーになる
FileListUp = dirInfo =>
{
    return dirInfo.GetDirectories().Select(d => FileListUp(d))
        .SelectMany(f => f)			// (2)ここ、なんか他の書き方ないのかな?
        .Concat(dirInfo.GetFiles().Select(f => f.FullName));
};

var di = new DirectoryInfo(".");

var list = FileListUp(di);

// 表示する
list.ToList().ForEach(s => Console.WriteLine(s));

(2)の部分のなんか微妙なんだけど、他の書き方ないのかな?


このエントリーをはてなブックマークに追加 Clip to Evernote
ブログランキング・にほんブログ村へ
にほんブログ村

[C#] Linqと再帰でファイルの一覧表示でやった一覧の出し方、
こっちの方がよさそう

Func<DirectoryInfo, IEnumerable<string>> FileListUp = null;    // (1)こうしておかないとエラーになる
FileListUp = dirInfo =>
{
    return (from d in dirInfo.GetDirectories()
             from f in FileListUp(d)
             select f)
              .Concat(from f in dirInfo.GetFiles()
                      select f.FullName);
};

var di = new DirectoryInfo(".");

var list = FileListUp(di);		// ← (2)

// 表示する
list.ToList().ForEach(s => Console.WriteLine(s));	// ← (3)

なんでいいかというと、
感覚的に(2)で一覧が作成されそうだけど、遅延評価されて実際は(3)のToList()のタイミングで作成される。(2)のあとにlistに対してLinqを行ったりしたら、ToList()したあとに同じことをするよりも速く処理(高速に)されたする。

たとえば、(3)のところを

list.Take(10).ToList().ForEach(s => Console.WriteLine(s));	// ← (3')

に変えると、一覧の最初から10個が表示されるのだが前の[C#] Linqと再帰でファイルの一覧表示のFileListUpで同じことをやるよりも速く終わる。


このエントリーをはてなブックマークに追加 Clip to Evernote
ブログランキング・にほんブログ村へ
にほんブログ村

↑このページのトップヘ