かずきのBlog@hatena

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

ReactiveProperty v2.1.8をリリースしました

最近BlogがReactivePropertyのリリース日記になってる感じがありますが…。v2.1.8をリリースしました。

www.nuget.org

v2.1.8

追加

  • Helpers名前空間にリアルタイムにコレクションの要素をフィルタリングするコレクション FilteredReadOnlyObservableCollection を追加しました。

解説

ObserveElementXXXXメソッドを追加したときに、コレクションの増減に対応するコードまで入れるとリアルタイムにコレクションから条件を満たす要素を選択できるという例を示しました。

okazuki.hatenablog.com

このコードに順序の管理を加えて、リアルタイムフィルタリングをするコレクションを作成しました。

テストコードからの抜粋になりますが、以下のように使います。

var source = new ObservableCollection<Person>(new[]
{
    new Person { Name = "tanaka1", IsRemoved = true },
    new Person { Name = "tanaka2", IsRemoved = false },
    new Person { Name = "tanaka3", IsRemoved = false },
});

// 初期状態ではtanaka1のみが対象
var filtered = source.ToFilteredReadOnlyObservableCollection(x => x.IsRemoved);
filtered.Select(x => x.Name).Is("tanaka1");
filtered.Count.Is(1);

// 無関係の要素を追加しても変わらない
source.Add(new Person { Name = "tanaka4", IsRemoved = false });
filtered.Select(x => x.Name).Is("tanaka1");
filtered.Count.Is(1);

// プロパティを変更してフィルターの対象になった場合は、その要素が追加される
source[3].IsRemoved = true;
filtered.Select(x => x.Name).Is("tanaka1", "tanaka4");
filtered.Count.Is(2);

source.Clear();
filtered.Count.Is(0);