11

元のコレクションよりも多くの要素を含む ReactiveUI 派生コレクションを作成することは可能ですか?

コレクションをフィルタリングし、単一のプロパティを選択する方法があることを確認しましたが、私が探しているのは、列挙型の SelectMany 操作と同等です。

たとえば、交通渋滞に巻き込まれたすべての乗客を表す派生コレクションを取得しようとすることを想像してください。

class Car 
{
    ReactiveCollection<Passenger> Passengers;
}

var TrafficJam=new ReactiveCollection<Car>();
EveryPassengerInTheTrafficJam=Cars.CreateDerivedCollection(c=>c.Passengers);

IEnumerable<ReactiveCollection<Passenger>>上記は機能しません。いずれにせよ、エラーはキャストできないReactiveCollection<Passenger>か、タイプに問題があると思います。

この平坦化の正しいアプローチがわかりません。確かに、ここで間違ったツリーを完全に吠えている可能性があります。同じことを達成するためのより良い方法があれば教えてください。

4

2 に答える 2

13

現時点では、変換としてCreateDerivedCollectionサポートされていませんSelectMany。削除を処理するにはトリッキーすぎます。アイテムがあまりない場合は、毎回コレクションを再生成できます。

cars.Changed
    .Select(_ => cars.SelectMany(x => x.Passengers).ToList())
    .ToProperty(this, x => x.Passengers);

編集:さて、ここに行きます:

var whenCarsOrPassengersInThoseCarsChange = Observable.Merge(
    cars.Changed
        .SelectMany(_ =>
            cars.Select(x => x.Passengers.Changed).Merge())
        .Select(_ => Unit.Default),
    cars.Changed.Select(_ => Unit.Default));

whenCarsOrPassengersInThoseCarsChange.StartWith(Unit.Default)
    .Select(_ => cars.SelectMany(x => x.Passengers).ToList())
    .ToProperty(this, x => x.Passengers);

したがって、乗客リストを再評価する必要がある場合、主に 2 つの状況が考えられます。

  1. 車内で乗客が交代するとき
  2. 車の1つが変わるとき

ただし、注意が必要なのは、コレクション内の車の乗客のみを監視することです(つまり、車が削除された場合、その乗客は気にしなくなります)。

自殺した乗客を適切に追跡する

したがって、その奇妙な SelectMany のアイデアは、「車のリストが変更されるたびに、乗客のコレクションがいつ変更されるかを表す Observable の新しいリストを作成し、それらをすべてマージする」というものです。

ただし、そのステートメントしかない場合、新しい乗客リストを取得する前に、車が追加さて乗客が変更されるのを待たなければならないため、車のリストが変更されたときにも更新する必要があります。

この「ユニット」事業とは?

この場合、実際には、これらの Observables が発生したときに出力する値は気にしません。"Unit" は void の Rx バージョンで、"Unit.Default" という単一の値しかありません。何かが起こったときだけ気にし、その価値が何であるかを気にしない場合に使用します。

于 2013-03-07T01:10:32.353 に答える
2

うーん...私はReactiveUIに精通しているわけではありませんが、読んだだけで、どこにSelectMany行くかを変更する必要があるようです:

var jam = cars.SelectMany(x => x.Passengers).CreateDerivedCollection(p => p);
于 2013-03-06T22:29:03.227 に答える