かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

ReactivePropertyが楽しい その2

前書いたのだと、毎回毎回内容をクリアしてるのでReactiveCollectionのうまみがほとんどないよね!ということなので、初期化して読み込みと続きのデータを読み込むとかいう例を書いてみました。参照設定とかネームスペースの設定さえしておけばLINQ Padでさくっと動くのも素晴らしいですね。

// 初期化して読み込む
var load = new ReactiveCommand();
// 続きを読み込む
var loadNext = new ReactiveCommand();
// 結果をためておくコレクション
var collection = default(ReactiveCollection<string>);


collection = Observable
    .Merge(
        load.Do(_ => collection.Clear()), // loadコマンドはコレクションをクリアして続きの処理をやる
        loadNext) // loadNextはコレクションはいじらずに続きの処理をやる
    .Select(_ => Enumerable.Range(1, 5).ToObservable()) // データとって
    .Switch()
    .Select(i => string.Format("{0}歳", i)) // 加工して
    .ToReactiveCollection(); // コレクションにするよ

// 初期状態の出力
collection.Dump();

// 最初の読み込み
load.Execute(null);
collection.Dump();

// 続きのデータの読み込み
loadNext.Execute(null);
collection.Dump();

// データを初期化して読み込み
load.Execute(null);
collection.Dump();

実行結果は以下のような感じ。

# 実行結果 #で始まる行は私が追記してます
# 初期状態では0件
ReactiveCollection<String> (0 items) 

# loadコマンドを実行すると5件読み込まれる
5ReactiveCollection<String> (5 items)  
1歳
2歳
3歳
4歳
5歳
 
# loadNextコマンドを実行するとつづけて5件読み込まれる
5ReactiveCollection<String> (10 items)  
1歳
2歳
3歳
4歳
5歳
1歳
2歳
3歳
4歳
5歳
 
# loadコマンドを実行すると中身がクリアされてデータが読み込まれる
5ReactiveCollection<String> (5 items)  
1歳
2歳
3歳
4歳
5歳

パズル組んでるみたいで楽しいですね!