0

考虑一下我是 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 的值?

谢谢

4

2 回答 2

0

Enigmativity 已经回答了这个问题,但是我认为应该指出的是,你可能不需要付出太多的努力,当你可以使用Observable.IntervalZip操作员来完成这项工作时。

这是一个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);
    }

然后按照上面的答案消费。

由于方法如此之小,您甚至可能会质疑是否需要它?

于 2013-10-03T15:10:29.720 回答
0

你不想做这样的事情吗?

var query =
    from le in ToObservableInterval(items, timeSpan, scheduler)
    select le.ServerName;
于 2013-10-02T00:18:18.903 回答