-->

C#

[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で同じことをやるよりも速く終わる。


このエントリーをはてなブックマークに追加

別のブログで公開してたものです。
一部をこっちのブログに移行しようと手動で(^^;)移行したものです。

前にWPFでマルチタッチを試してみたのと同様のWindowsストアアプリを試しに作ってみた。

Windowsストアアプリを新規作成して、canvasを張り付けてPointerPressed、PointerMoved、PointerReleasedイベントを取るようにする。
これらのイベントでマウス、ペン、タッチのイベントが発生する。
イベントで渡されるPointerRoutedEventArgsのGetCurrentPointで
PointerPointを取得してそのPointerDeviceのPointerDeviceTypeプロパティでマウス、ペン、タッチの区別ができる。
複数タッチを区別するのはPointerPointのPointerIdプロパティで行う。

サンプル:TestMultiTouchWS.zip

続きを読む
このエントリーをはてなブックマークに追加

別のブログで公開してたものです。
一部をこっちのブログに移行しようと手動で(^^;)移行したものです。

Windowsでマルチタッチ試してみた。

マルチタッチに対応しているのはOSはWindows7からで対応するアプリを開発するには.NetのWPF4以降か、Win32 APIを使う。Windos8以降だとWindowsストア向けに作れば対応できる。(Windowsストア向けは、まだ調べてない)

WPFアプリのプロジェクトを新規作成してCanvasを貼り付けて、TouchDown、TouchMove、TouchUpイベントを取ればマルチタッチが取れるようになる。これらのイベントはマウスのMouseDown、MouseMove、MouseUpイベントのタッチ版のようなものだ。

複数のタッチ(指)を認識するには、タッチイベントで渡されるTouchEventArgsのTouchDeviceのIdで複数の指を識別する。複数のタッチそれぞれにIDがふられてそれぞれイベントが発生することになる。

サンプルは、タッチしたところに赤丸(かなり大きいが(^^;))とIDが表示されるようになっている。ついでにマウスイベント、スタイラス(デジタイザペン)でも円を描画するようにしてる。マウスは青丸で押してるボタンを表示する。スタイラスは緑丸とIDを表示し、円は筆圧によって大きさが変わるようになっている。
これでわかるのが、タッチするとスタイラス、マウスのイベントが、スタイラスで画面を触るとマウスのイベントが発生する。この辺はそれぞれのEventArgsのhandledプロパティにtrueを設定すると発生しなくなるが、タッチ、スタイラスとも長押しすると右ボタンを押したマウスイベントは発生するようなので都合が悪い場合はなんか別の方法で回避しないといけない。(簡単な方法があるかは調べてないので不明)

サンプル:TestMultiTouchWPF.zip

全体を見ないとわからない部分もあるんだが、サンプルからタッチ関係のイベント部分を抜き取ったものものせとく。



このエントリーをはてなブックマークに追加

Linqとラムダ式使って、指定ディレクトリ以下のファイル一覧を取得してみた。
プログラム中の(1)のようにFileListUpを宣言してnullを代入しておかないと自分自身を再帰呼び出しするようなブログラムはFileListUpのところでエラーになる。

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

    return q.ToList();
};

var di = new DirectoryInfo(".");

var list = FileListUp(di);

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

このエントリーをはてなブックマークに追加

↑このページのトップヘ