如何在C#中提取当前IObservable的字段

时间:2013-10-01 18:21:47

标签: c# sql system.reactive streaminsight

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

由于

2 个答案:

答案 0 :(得分:0)

难道你不想做这样的事吗?

var query =
    from le in ToObservableInterval(items, timeSpan, scheduler)
    select le.ServerName;

答案 1 :(得分: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);
    }

然后根据上面的答案消费。

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