0

Reactive拡張フレームワークのIObservable[以下のサンプルの名前付き行]があり、監視する各オブジェクトにインデックス番号を追加したいと思います。

私はZip関数を使用してこれを実装しようとしました:

rows.Zip(Enumerable.Range(1, int.MaxValue), (row, index) => 
    new { Row = row, Index = index })
    .Subscribe(a => ProcessRow(a.Row, a.Index), () => Completed());

..しかし、残念ながらこれはスローします

ArgumentOutOfRangeException:指定された引数が有効な値の範囲外でした。パラメータ名:使い捨て

Zip関数を間違って理解していますか、それともコードに問題がありますか?

コードの範囲部分は問題ではないようで、IObservableはまだイベントを受信して​​いません。

4

3 に答える 3

1

.Select には、インデックスを含めるためのオーバーロードがあります。

rows.Select((row, index) => new { row, index });
于 2010-04-25T02:12:35.573 に答える
0

どうやら、Zip拡張メソッドは元のカスタムIObservableを匿名のobservableに変換し、それにサブスクライブすると、IDisposableを実装しないSystem.Collections.Generic.AnonymousObserverが作成されます。したがって、Subscribeメソッドを通常の方法(少なくとも私が使用した方法)で実装することはできません。

public IDisposable Subscribe(IObserver<T> observer) {
  // ..add to observer list..
  return observer as IDisposable
}

正解は次のようになります。

return Disposable.Create(() => Observers.Remove(observer));

ただし、CollectionはCompleted-methodで変更される可能性があるため、処理する前にリストのコピーを作成することに注意してください。

public void Completed()
{
    foreach (var observer in Observers.ToList())
    {
        observer.OnCompleted();
    }
 }
于 2010-03-25T12:58:01.897 に答える
0

私はあなたの問題が何であるか分かりません.これはあなたのために働きますか?

    static void Main(string[] args)
    {
        var rows = new List<int> { 4,5,1,2,5 }.ToObservable();
        rows.Zip(Enumerable.Range(1, int.MaxValue), (row, index) =>
            new { Row = row, Index = index })
            .Subscribe(a => ProcessRow(a.Row, a.Index), () => Completed());

        Console.ReadLine();
    }
    static void ProcessRow(int row, int index) {
        Console.WriteLine("Row {0}, Index {1}", row, index);
    }
    static void Completed() {
    }
于 2010-03-28T13:51:23.013 に答える