【发布时间】:2016-04-03 16:00:05
【问题描述】:
我有一个由外部软件生成的文件,我将其读入 C# 程序。 在 streamreader 检索文件后,我做了几种方法来进行我需要的安排。像这样:
object[] array = new object[7];
// THE "WHILE" SPLIT MORE THAN 1 ORDERS FILLED
// INSERT FILL INFORMATION INTO ARRAY TO POPULATE TABLES
while (QtyFilled > 0)
{
for (int i = 0; i < fillData.Length; i++)
{
if (i == 4) // check the price
{
array[i] = Math.Round((double)fillData.GetValue(i), prodSpecs.DigitsAfterDecimal);
}
else
{
array[i] = fillData.GetValue(i);
}
array[5] = 1; // set the fill qty to 1 always
}
switch (BuySell)
{
case "B":
TradeSequenceOrientation += QtyFilled;
Table_Buy.Rows.Add(array);
// if (Table_Buy.Rows.Count <= 1) break;
DataView viewB = new DataView(Table_Buy);
viewB.Sort = "Contract ASC, DateExec ASC, TimeExec ASC";
Table_Buy = viewB.Table;
break;
case "S":
TradeSequenceOrientation -= QtyFilled;
Table_Sell.Rows.Add(array);
//if (Table_Sell.Rows.Count <= 1) break;
DataView viewS = new DataView(Table_Sell);
viewS = new DataView(Table_Sell);
viewS.Sort = "Contract ASC, DateExec ASC, TimeExec ASC";
Table_Sell = viewS.Table;
break;
}
MERGE_TABLES();
QtyFilled--;
}
这种方式工作得很好,但可以优化。此外,一旦建立导入,我需要进行其他查询。
例如,当“买入”和“卖出”完成时,我需要查询“数量”是否不相同(参见图片上的“复杂查询”)。例如你想买 10 个数量,然后像 6,2,2 一样被执行。再后来,一次性卖掉:10。
activity = 6 ;
activity =+ 2 ;
activity =+ 2 ;
activity =- 10 ;
activity == 0;
即使“数量”不同,买卖活动之间也存在关系,直到结束,直到活动为 0。
所以最终表格必须使这种特殊性看起来像图片上的“复杂查询”窗口。
PICTURE OF GENERATED TABLES EXAMPLES
为了优化代码,我对 LINQ 查询很感兴趣。我做了几次测试,我无法得到想要的结果(如图)。我可以使用“位置”仅显示相关产品。不利的是,我似乎无法合并类似于图片的线条。因为我从查询开始,所以我专注于简单过滤器这一事实,但我发现自己很快就被屏蔽了,因为数据量很大,而且很难在购买和销售之间始终保持相同的行数。
代码如下:
var queryBuys = from rowbuy in TableBuys.buyTable.AsEnumerable()
where rowbuy.Field<string>("Product") == "CL"
select rowbuy;
var querySells = from rowsell in TableSells.sellTable.AsEnumerable()
where rowsell.Field<string>("Product") == "CL"
select rowsell;
Array arrBuy = null;
Array arrSell = null;
foreach (var item in queryBuys)
{
arrBuy = item.ItemArray.ToArray();
}
foreach (var item in querySells)
{
arrSell = item.ItemArray.ToArray();
}
//Array arrMerge = arrBuy
foreach (var item in arrBuy)
{
trackTable.Rows.Add(arrBuy, arrSell);
}
如果我能有查询示例,可以在流阅读器之后直接完成这项工作,那就太好了。我的目标是让决赛桌看起来像图片上“大 B&C”部分的组合。
感谢您的帮助,
【问题讨论】:
-
我认为没有一个查询可以完成这项工作。您有所谓的“包装问题”,其中买卖数量不同,因此您必须包装物品以使数量匹配。 2000年前的罗马人在试图收拾战车出征时无法解决这个问题,而今天的数学家仍然没有理想的解决方案。
-
感谢 jdweng 的回复,我知道要实现这一点真的很头疼。正如我所提到的,我已经用很多方法完成了,因为我真的希望代码得到优化,所以我需要用查询保存行。