为什么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;
}
}
}
答案 0 :(得分:3)
LINQ查询推导适用于实现相应Select / Where / etc的任何内容。编译器可以转换为的方法。它不限于特定的接口。这类似于如何在不实现IEnumerable的对象上进行操作,但包含GetEnumerator和MoveNext / Current方法。有效地LINQ表达式由编译器输入。这也解释了为什么你可以在IObservable上使用一些LINQ表达式但不是全部(有意排除orderby)。
答案 1 :(得分:2)
为什么
IObservable
未实施IEnumerable
或IQuerable
由于IObservable
不必然代表集合,因此它可能是推送更改事件的单个对象。
但我可以使用Linq查询吗?
Observable
类为IObservable
接口实现类似Linq的运算符。如果基础类型不是集合,我不知道它是做什么的,但我的猜测是将它视为单项集合或抛出异常。
答案 2 :(得分:2)
通过实施适当的扩展方法(Select
,SelectMany
,Where
,...),可以使用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