C# IObservable<;字节[]>;转换

C# IObservable<;字节[]>;转换,c#,C#,如何将IObservable转换为字节[] 我想将IObservable转换为wav文件并将其保存在磁盘上 DisOutput d; File.WriteAllBytes("outputsend.wav", d); 我有一个数组IObservable,我想把它转换成byte[],这样我就可以写入文件了。如何将IObservable转换为byte[],因为writealBytes将byte[]作为输入我假设您有一个框架,可以动态地以IObservable的形式生成WAV文件。大概,当生成完成时,

如何将IObservable转换为字节[]

我想将IObservable转换为wav文件并将其保存在磁盘上

DisOutput d;
File.WriteAllBytes("outputsend.wav", d);

我有一个数组IObservable,我想把它转换成byte[],这样我就可以写入文件了。如何将IObservable转换为byte[],因为writealBytes将byte[]作为输入

我假设您有一个框架,可以动态地以
IObservable
的形式生成WAV文件。大概,当生成完成时,
IObservable
将触发
OnCompleted
以发出此信号

IObservable<Byte> observable;
发生的情况是,
ToList
操作符将收集随时间增长的列表中的所有传入字节。当传入序列完成时,将通知订阅者,在这种情况下,字节列表将写入文件

但是,不需要在内存中缓冲字节。相反,它们可以直接写入文件。重要的是,当传入的字节流完成时关闭文件,这可以通过使用这种稍微更复杂但也更有效的扩展方法来实现:

static class ObservableExtensions {

  public static IObservable<Unit> WriteToFile(this IObservable<Byte> source, String fileName) {
    return Observable.Create<Unit>(
      observer => {
        var fileStream = new SerialDisposable();
        return new CompositeDisposable(
          source.Subscribe(
            value => {
              try {
                if (fileStream.Disposable == null)
                  fileStream.Disposable = File.Create(fileName);
                ((FileStream) fileStream.Disposable).WriteByte(value);
              }
              catch (SystemException ex) {
                observer.OnError(ex);
              }
            },
            observer.OnError,
            () => {
              observer.OnNext(Unit.Default);
              observer.OnCompleted();
            }
          ),
          fileStream
        );
      }
    );
  }

}
要处理错误,您可以使用另一个重载
Subscribe

observable.WriteToFile("outputsend.wav").Subscribe(
  _ => Console.WriteLine("Done"),
  ex => Console.WriteLine(ex)
);

这将向控制台写入异常。生产质量应用程序需要更复杂的方法。

您能提供更多详细信息吗?不确定你想完成什么,不太清楚。显示DisOutput的类def,并明确字节的编码。我有一个数组IObservable,我想将其转换为byte[],以便可以写入一个非常好的文件。您能解释一下类中的“单位”是什么吗?@user2837961:
IObservable
提供了
T
类型的事件序列。通常,此类型包含一些描述事件的数据,但有时您需要一个没有数据的
void
事件。在这种情况下,您可以使用
单元
observable.WriteToFile("outputsend.wav").Subscribe(_ => Console.WriteLine("Done"));
observable.WriteToFile("outputsend.wav").Subscribe(
  _ => Console.WriteLine("Done"),
  ex => Console.WriteLine(ex)
);