考虑一下我对C#世界的新认识以及与IObservable术语相关的术语。 我有一个关于如何从Current中提取信息的问题。这是我的c#代码:
private static IObservable<T> ToObservableInterval<T>(IEnumerable<T> source,
TimeSpan period, System.Reactive.Concurrency.IScheduler scheduler)
{
return Observable.Using(
() => source.GetEnumerator(),
it => Observable.Generate(
default(object),
_ => it.MoveNext(),
_ => _,
_ =>
{
Console.WriteLine("Input {0}", it.Current);
return it.Current;
},
_ => period, scheduler));
}
如果我在源代码中传递此类的值:
class LogEvent
{
public DateTime X { get; set; }
public int Id { get; set; }
public string ServerName { get; set; }
public string Level { get; set; }
public override string ToString()
{
return new { x, Id, ServerName, Level}.ToString();
}
}
是否有一种简单的方法可以从当前表示中提取x,Id,Level的值?
由于
答案 0 :(得分:0)
难道你不想做这样的事吗?
var query =
from le in ToObservableInterval(items, timeSpan, scheduler)
select le.ServerName;
答案 1 :(得分:0)
Enigmativity已经回答了这个问题,我认为应该指出,当你可以使用Observable.Interval
和Zip
运算符来完成这项工作时,你可能不需要付出那么多努力。
这是一个LinqPad脚本,您可以使用该脚本查看每个时间段内只会从IEnumerable<T>
中提取值。
void Main()
{
//GetNumbers().Dump();
var period = TimeSpan.FromSeconds(1);
var scheduler = Scheduler.Default;
var source = GetNumbers();
Observable.Interval(period, scheduler)
.Zip(source, (a,b)=>b)
.Dump();
}
// Define other methods and classes here
public IEnumerable<int> GetNumbers()
{
var i = 0;
while (i<10)
{
DateTimeOffset.Now.ToString("o").Dump();
yield return i++;
}
}
因此,您可以将ToObservableInterval
方法简化为:
private static IObservable<T> ToObservableInterval<T>(
IEnumerable<T> source,
TimeSpan period,
System.Reactive.Concurrency.IScheduler scheduler)
{
return Observable.Interval(period, scheduler)
.Zip(source, (a,b)=>b);
}
然后根据上面的答案消费。
由于方法太小,您甚至可能会质疑是否需要它?