我正在创建一个c#windows应用程序,使用betfair exchange webservice显示当前的体育市场费率,我使用
getmarketpricescompressed()
返回如下所示的价格字符串的方法:
106093239~GBP~ACTIVE~0~1~~true~5.0~1343114432333~~N:7337~1~6992.56~2.16~~~false~~~~|2.16~1036.19~L~1~2.14~97.18~L~2~2.12~5.0~L~3~|2.18~467.36~B~1~2.2~34.12~B~2~2.22~162.03~B~3~:414464~2~102181.96~1.86~~~false~~~~|1.85~2900.33~L~1~1.84~1831.59~L~2~1.83~1593.73~L~3~|1.86~58.83~B~1~1.87~1171.77~B~2~1.88~169.15~B~3~
我不知道如何正确解压缩此字符串,现在我正在使用此代码:
GetMarketPricesCompressedReq price_req1 = new GetMarketPricesCompressedReq();
price_req1.header = header2;
price_req1.marketId = marketid_temp;
price_req1.currencyCode = "GBP";
GetMarketPricesCompressedResp price_resp = new GetMarketPricesCompressedResp();
price_resp = bfg2.getMarketPricesCompressed(price_req1);
//MessageBox.Show(price_resp.errorCode.ToString());
//richTextBox1.Text = "";
//richTextBox1.Text = price_resp.marketPrices;
string prices = price_resp.marketPrices;
richTextBox1.Text = price_resp.marketPrices;
string[] ab1 = prices.Split('|');
string[] temp = ab1[1].Split('~');
textBox3.Text = temp[0];
textBox4.Text = temp[4];
textBox5.Text = temp[8];
temp = ab1[2].Split('~');
textBox6.Text = temp[0];
textBox7.Text = temp[4];
textBox8.Text = temp[8];
temp = ab1[3].Split('~');
textBox9.Text = temp[0];
textBox10.Text = temp[4];
textBox11.Text = temp[8];
temp = ab1[4].Split('~');
textBox12.Text = temp[0];
textBox13.Text = temp[4];
textBox14.Text = temp[8];
if (ab1.Length >5)
{
temp = ab1[5].Split('~');
textBox15.Text = temp[0];
textBox16.Text = temp[4];
textBox17.Text = temp[8];
temp = ab1[6].Split('~');
textBox18.Text = temp[0];
textBox19.Text = temp[4];
textBox20.Text = temp[8];
}
它适用于一些匹配,但我观察到一些其他匹配的字符串更改,因此它生成异常, any1可以帮我用正确的代码解压缩这个字符串,我用Google搜索并发现了一个vb代码,这个代码不是很有用,
和顺便说一句,我想安排这样的数据:
答案 0 :(得分:3)
请考虑以下事项:
a|b|c|d
在这里,你有四个块。但它不一定只有四个。它可以是两个,也可以是六个。
尝试通过迭代由
得到的字符串数组来实现它string[] ab1 = prices.Split('|');
像
这样的东西foreach(var stringChunk in ab1)
{
string[] temp = stringChunk.Split('~');
// use the strings here as you please
}
考虑使用更动态的方法来呈现数据,使用基于行的重复控件而不是静态文本框。 =)
压缩数据的完整文档可在此处获取:https://docs.developer.betfair.com/betfair/#!page=00008360-MC.00008307-MC
答案 1 :(得分:2)
猜测,我认为数据的组织方式如此
首先由:
分隔,然后|
分隔
106093239〜GBP〜ACTIVE〜0〜1 ~~真〜5.0〜1343114432333 ~~Ñ
7337〜1〜6992.56〜2.16 ~~~假~~~~
2.16〜1036.19〜L〜1〜2.14〜97.18〜L〜2〜2.12〜5.0〜1〜3〜 2.18〜467.36〜B〜1〜2.2〜34.12〜B〜2〜2.22〜162.03〜B〜3〜414464〜2〜102181.96〜1.86 ~~~假~~~~ 1.85〜2900.33〜L〜1〜1.84〜1831.59〜L〜2〜1.83〜1593.73〜1〜3〜 1.86〜58.83〜B〜1〜1.87〜1171.77〜B〜2〜1.88〜169.15〜B〜3〜
我认为第一行显然是标题,第一个数字可能是市场ID。
同样,每个后续部分的第一部分是行标识符。由~
界定的
(SelectionId)7337(Order)1(TotalMatched?)6992.56(EvenPoint)2.16(???)false
我认为价格行在元组4中由~
分隔,就像这样
(价格)2.16(MatchAvailable)1036.19(类型)L(订单)1
(价格)2.14(MatchAvailable)0097.18(类型)L(订单)2
(价格)2.12(MatchAvailable)0005.00(Type)L(订购)3
例如。
为了测试我的猜测,我必须与他们网站上的BetFair渲染进行比较。
答案 2 :(得分:2)
我将vb代码转换为c#我自己,如果有人发现它有用,我会在这里发布:
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
namespace stock
{
class UnpackMarketPricesCompressed : stock.BFExchangeService.MarketPrices
{
//The substitute code for "\:"
private const string ColonCode = "&%^@";
//Unpack the string
public UnpackMarketPricesCompressed(string MarketPrices)
{
string[] Mprices = null;
string[] Part = null;
string[] Field = null;
int n = 0;
Mprices = MarketPrices.Replace("\\:", ColonCode).Split(':');
//Split header and runner data
Field = Mprices[0].Replace("\\~", "-").Split('~');
//Split market data fields
marketId = Convert.ToInt32(Field[0]);
//Assign the market data
currencyCode = Field[1];
marketStatus = (stock.BFExchangeService.MarketStatusEnum)Enum.Parse(typeof(stock.BFExchangeService.MarketStatusEnum), Field[2], true);
delay = Convert.ToInt32(Field[3]);
numberOfWinners = Convert.ToInt32(Field[4]);
marketInfo = Field[5].Replace(ColonCode, ":");
discountAllowed = (Field[6].ToLower() == "true");
marketBaseRate = float.Parse(Field[7]);
lastRefresh = long.Parse(Field[8]);
removedRunners = Field[9].Replace(ColonCode, ":");
bspMarket = (Field[10] == "Y");
n = Mprices.Length - 1;
// ERROR: Not supported in C#: ReDimStatement
//For each runner
for (int i = 0; i <= n; i++)
{
Part = Mprices[i + 1].Split('|');
//Split runner string into 3 parts
Field = Part[0].Split('~');
//Split runner data fields
runnerPrices[i] = new stock.BFExchangeService.RunnerPrices();
var _with1 = runnerPrices[i];
//Assign the runner data
_with1.selectionId = Convert.ToInt32(Field[0]);
_with1.sortOrder = Convert.ToInt32(Field[1]);
_with1.totalAmountMatched = Convert.ToDouble(Field[2]);
_with1.lastPriceMatched = Convert.ToDouble(Field[3]);
_with1.handicap = Convert.ToDouble(Field[4]);
_with1.reductionFactor = Convert.ToDouble(Field[5]);
_with1.vacant = (Field[6].ToLower() == "true");
_with1.farBSP = Convert.ToDouble(Field[7]);
_with1.nearBSP = Convert.ToDouble(Field[8]);
_with1.actualBSP = Convert.ToDouble(Field[9]);
_with1.bestPricesToBack = Prices(Part[1]);
_with1.bestPricesToLay = Prices(Part[2]);
}
}
private stock.BFExchangeService.Price[] Prices(string PriceString)
{
string[] Field = null;
stock.BFExchangeService.Price[] Price = null;
int k = 0;
int m = 0;
Field = PriceString.Split('~');
//Split price fields
m = (Field.Length / 4) - 1;
//m = number of prices - 1
// ERROR: Not supported in C#: ReDimStatement
for (int i = 0; i <= m; i++)
{
Price[i] = new stock.BFExchangeService.Price();
var _with2 = Price[i];
_with2.price = Convert.ToInt32(Field[k + 0]);
//Assign price data
_with2.amountAvailable = Convert.ToInt32(Field[k + 1]);
_with2.betType = (stock.BFExchangeService.BetTypeEnum)Enum.Parse(typeof(stock.BFExchangeService.BetTypeEnum), Field[k + 2], true);
_with2.depth = Convert.ToInt32(Field[k + 3]);
k += 4;
}
return Price;
//Return the array of prices
}
}
}