【发布时间】:2016-02-01 22:11:02
【问题描述】:
在编写股票市场交易员IObserver 的过程中,我遇到了三个错误,主要来自Reactive Extensions 库。
我有以下CompanyInfo 类:
public class CompanyInfo
{
public string Name { get; set; }
public double Value { get; set; }
}
还有一个叫做StockMarket的IObservable<CompanyInfo>:
public class StockMarket : IObservable<CompanyInfo>
我的Observer 如下所示:
public class StockTrader : IObserver<CompanyInfo>
{
public void OnCompleted()
{
Console.WriteLine("Market Closed");
}
public void OnError(Exception error)
{
Console.WriteLine(error);
}
public void OnNext(CompanyInfo value)
{
WriteStock(value);
}
private void WriteStock(CompanyInfo value) { ... }
}
我运行以下代码:
StockMarket market = GetStockMarket();
StockTrader trader = new StockTrader();
IObservable<CompanyInfo> differential = market //[F, 1], [S, 5], [S, 4], [F, 2]
.GroupBy(x => x.Name) //[F, 1], [F, 2]; [S, 5], [S, 4]
.SelectMany(x => x //4, 8, 2, 3
.Buffer(2, 1) //(4, 8), (8, 2), (2, 3), (3)
.SkipLast(1) //(4, 8), (8, 2), (2, 3)
.Select(y => new CompanyInfo //(+100%), (-75%), (+50%)
{
Name = x.Key,
Value = (y[1].Value - y[0].Value) / y[0].Value
}) //[F, +100%]; [S, -20%]
);
using (IDisposable subscription = differential.Subscribe(trader))
{
Observable.Wait(market);
}
出现三个错误之一:
-
从
Reactive Extensions中抛出以下ArgumentException:System.ArgumentException:已添加具有相同键的项目。 在 System.ThrowHelper.ThrowArgumentException(ExceptionResource 资源) 在 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) 在 System.Reactive.Linq.Observable.GroupBy'3._.OnNext(TSource 值)
-
以下
IndexOutOfRangeException:参数名称:索引 在 System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument 参数,ExceptionResource 资源) 在 System.Collections.Generic.List'1.get_Item(Int32 索引) 在 StockMarketTests.c__DisplayClass0_0.b__2(IList'1 y) 在 System.Reactive.Linq.Observable.Select'2._.OnNext(TSource 值)
Console的文字偶尔会发生调整(颜色应该一致):
什么会导致这些奇怪的症状?
【问题讨论】:
标签: c# .net linq system.reactive observable