IObservable<T>使用linq查询。

问题描述 投票:1回答:4

为什么是 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;
        }
    }
}
c# .net linq system.reactive
4个回答
3
投票

LINQ查询理解工作在任何实现了相应的SelectWhere等方法,编译器可以翻译成的东西上。它并不局限于特定的接口。这类似于你可以在一个没有实现IEnumerable,但包含GetEnumerator和MoveNextCurrent方法的对象上foreach。实际上LINQ表达式被编译器进行了鸭型化。这也解释了为什么你可以在IObservable上使用一些LINQ表达式,但不能使用所有的LINQ表达式(orderby被有意排除在外)。


2
投票

为什么 IObservable 不实行 IEnumerableIQuerable

因为 IObservable一定 代表 集合 - 它可以是一个单一的对象,推送变化事件。

但我可以使用Linq查询?

Observable 类实现了类似Linq的运算符,用于 IObservable 接口。我不知道如果底层类型不是集合,它会做什么,但我猜测它要么把它当作单项集合,要么抛出异常。


2
投票

通过实现适当的扩展方法,任何东西都可以和Linq一起工作(Select, SelectMany, Where, ...). 但这通常只有当类型是单体时才有意义。

我推荐阅读 单元的奇迹其中有实现自定义Linq到你的类型的例子。

Observable<T>జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ Select 方法给你回一个 Observable<T2> 其中的项目已经通过函数运行。所以,你可以通过以下方式来实现 "这个可观察的项目,但所有项目+1"。from x in obs select x + 1.


0
投票

System.Reactive NuGet将允许你使用LINQ到IObservable。

© www.soinside.com 2019 - 2024. All rights reserved.