かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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歳

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