2010-11-02 4 views
1

J'ai essayé le test suivant dans LinqPad 4 et j'ai obtenu une erreur "Observable not in context". La branche IEnumerable fonctionne, et, curieusement, je ne reçois pas d'erreur pour IObservable lui-même, juste pour la méthode statique Observable.Range.Référence observable manquante dans LinqPad 4?

static void Main() 
{ 
IEnumerableSieve(); 
IObservableSieve(); 
} 

private static void IEnumerableSieve() 
{ 
IEnumerable<int> oddsFrom3 = IntsFrom(3, 2); 
List<int> cache = new List<int>() { 2 }; 

IEnumerable<int> primes = oddsFrom3. 
    Where(candidate => cache.TakeWhile(prime => prime * prime <= candidate). 
    Where(trialDivisor => candidate % trialDivisor == 0).Count() == 0); 

Console.WriteLine("IEnumerable oddsFrom3:"); 
foreach (int p in primes.Take(20)) 
{ 
    Console.WriteLine("{0}", p); 
    cache.Add(p); 
} 
} 

private static void IObservableSieve() 
{ 
const int bigMax = 1 << 30; 

// Generate the candidates as observables, cache the primes in an IEnum list as before. 
// But it's TERRIBLE that the cache is now of a different TYPE than the thing it's caching. 
// The cache is IEnumerable, and the thing it's caching is an IObservable. 

IObservable<int> oddsFrom3 = Observable.Range(3, bigMax).Where(i => i % 2 == 1); 
List<int> cache = new List<int>() { 2 }; 

IObservable<int> primes = oddsFrom3. 
    Where(candidate => cache. 
    TakeWhile(prime => prime * prime <= candidate). 
    Where(trialDivisor => candidate % trialDivisor == 0).Count() == 0); 

Console.WriteLine("IObservable oddsFrom3 "); 

primes.Take(20).Subscribe(p => { Console.WriteLine("{0}", p); cache.Add(p); }); 
} 

static IEnumerable<int> IntsFrom(int i, int increment) 
{ 
while (true) 
{ 
    yield return i; 
    i += increment; 
} 
} 

des indices?

Répondre

1

Je l'ai trouvé. F4 dans LinqPad affiche une boîte de dialogue Ajouter une référence, et tout fonctionne correctement à partir de là.