【发布时间】:2015-03-28 12:39:09
【问题描述】:
刚学RX,想做一个迭代文件系统的程序。这是我想出的有效方法:
using System;
using System.IO;
using System.Reactive.Disposables;
using System.Reactive.Linq;
namespace ConsoleApplication8
{
internal class Program
{
private static IObservable<string> GetFiles(string folder, string filePattern)
{
return Observable.Create<string>(
o =>
{
var files = Directory.GetFiles(folder, filePattern);
foreach (var file in files)
{
o.OnNext(file);
}
var folders = Directory.GetDirectories(folder);
foreach (var f in folders)
{
var x = GetFiles(f, filePattern);
x.Subscribe(p => { o.OnNext(p); });
}
o.OnCompleted();
return Disposable.Empty;
});
}
private static void Main(string[] args)
{
var o = GetFiles(@"d:\temp", "*.*");
o.Subscribe(p => { Console.WriteLine(p); });
Console.Read();
}
}
}
(注意使用递归,再次调用GetFiles并订阅)
虽然它看起来很笨拙,但我不禁想到我应该使用像 Concat 这样的东西来组合序列,而不是仅仅将它们冒泡。
我还想将 Foreach 更改为 Parallel.ForEach,但我不确定使用 RX 会产生什么后果。我似乎找不到太多文档。
有关如何使用 RX 更好地编写此代码的任何提示?
【问题讨论】:
-
哇,真不敢相信我从来不知道你可以用这个代替: var files = Directory.GetFiles(folder, filePattern, SearchOption.AllDirectories);简化了很多事情。但原始问题仍然适用。
-
从文件系统中读取文件本质上是一个枚举——正如您所达到的解决方案所证明的那样。因此,这并不是学习 Rx 的好例子。它不是很“反应性”。更好的做法是创建一个 observable,每当一个文件被添加到一个目录时,它就会产生一个事件。
FileSystemWatcher与Observable.FromEventPattern结合的事件可能是这方面的起点。 -
好建议。我只是在寻找一些可以尝试使用 RX 的东西,我会给你一个建议。谢谢。
标签: c# system.reactive