IObservable <t>使用linq查询</t>

时间:2014-02-21 15:32:14

标签: c# .net linq system.reactive

为什么IObservable<T>不是IEnumerable<T>IQueryable<T>的实现,但我可以使用LINQ查询? IObservable是特殊类型吗?

我曾经认为只有Linq查询IEnumerable或IQueryable,但事实并非如此。以下代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Rx_Test1
{
    public static class IMyClassExtension
    {

        public static MyClass<TResult> Select<TSource, TResult>(this MyClass<TSource> source, Func<TSource, int, TResult> selector)
        {
            return null;
        }

        public static MyClass<TResult> Select<TSource, TResult>(this MyClass<TSource> source, Func<TSource, TResult> selector)
        {
            return null;
        }

    }
    public class MyClass<T>
    {

    }
    class Program
    {
        static void Main(string[] args)
        {
            var myclass = new MyClass<int>();
            var q = from m in myclass 
                    select m;
        }
    }
}

4 个答案:

答案 0 :(得分:3)

LINQ查询推导适用于实现相应Select / Where / etc的任何内容。编译器可以转换为的方法。它不限于特定的接口。这类似于如何在不实现IEnumerable的对象上进行操作,但包含GetEnumerator和MoveNext / Current方法。有效地LINQ表达式由编译器输入。这也解释了为什么你可以在IObservable上使用一些LINQ表达式但不是全部(有意排除orderby)。

答案 1 :(得分:2)

  

为什么IObservable未实施IEnumerableIQuerable

由于IObservable必然代表集合,因此它可能是推送更改事件的单个对象。

  

但我可以使用Linq查询吗?

Observable类为IObservable接口实现类似Linq的运算符。如果基础类型不是集合,我不知道它是做什么的,但我的猜测是将它视为单项集合或抛出异常。

答案 2 :(得分:2)

通过实施适当的扩展方法(SelectSelectManyWhere,...),可以使用Linq工作。但是,当类型为monad时,这通常才有意义。

我建议您阅读The Marvels of Monads,其中包含实施自定义Linq-to-your-type的示例。

对于Observable<T>Select方法会返回Observable<T2>,其中项目已通过函数运行。因此,您可以通过from x in obs select x + 1执行“此可观察,但所有项目+1”等操作。

答案 3 :(得分:0)

System.Reactive NuGet将允许您使用LINQ进行IObservable