为什么是 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;
}
}
}
LINQ查询理解工作在任何实现了相应的SelectWhere等方法,编译器可以翻译成的东西上。它并不局限于特定的接口。这类似于你可以在一个没有实现IEnumerable,但包含GetEnumerator和MoveNextCurrent方法的对象上foreach。实际上LINQ表达式被编译器进行了鸭型化。这也解释了为什么你可以在IObservable上使用一些LINQ表达式,但不能使用所有的LINQ表达式(orderby被有意排除在外)。
为什么
IObservable
不实行IEnumerable
或IQuerable
因为 IObservable
不 一定 代表 集合 - 它可以是一个单一的对象,推送变化事件。
但我可以使用Linq查询?
该 Observable
类实现了类似Linq的运算符,用于 IObservable
接口。我不知道如果底层类型不是集合,它会做什么,但我猜测它要么把它当作单项集合,要么抛出异常。
通过实现适当的扩展方法,任何东西都可以和Linq一起工作(Select
, SelectMany
, Where
, ...). 但这通常只有当类型是单体时才有意义。
我推荐阅读 单元的奇迹其中有实现自定义Linq到你的类型的例子。
在 Observable<T>
జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ Select
方法给你回一个 Observable<T2>
其中的项目已经通过函数运行。所以,你可以通过以下方式来实现 "这个可观察的项目,但所有项目+1"。from x in obs select x + 1
.
System.Reactive NuGet将允许你使用LINQ到IObservable。