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?