6

我正在创建 ac# windows 应用程序以使用 betfair 交换网络服务显示当前的体育市场价格,我使用了

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 可以帮助我使用正确的代码来解压这个字符串,我已经用谷歌搜索它并找到了一个 vb 代码,它不是很有用,

顺便说一句,我想以这样的方式排列数据:

在此处输入图像描述

4

3 回答 3

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

于 2012-07-24T07:34:03.690 回答
2

只是猜测,我认为数据是这样组织的

首先分隔:然后|我们得到

106093239~GBP~ACTIVE~0~1~~true~5.0~1343114432333~~N

7337~1~6992.56~2.16~假~~~~
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~

我认为第一行显然是一个标题,第一个数字可能是市场 ID。同样,每个后续部分的第一部分是行标识符。~由类似的东西分隔

(SelectionId)7337 (Order)1 (TotalMatched?)6992.56 (EvenPoint)2.16 (???)false

我认为价格行由 4 元组分隔~,就像这样

(Price)2.16 (MatchAvailable)1036.19 (Type)L (Order)1
(Price)2.14 (MatchAvailable)0097.18 (Type)L (Order)2
(Price)2.12 (MatchAvailable)0005.00 (Type)L (Order)3

例如。

为了测试我的猜测,我必须与他们网站上的 BetFair 渲染进行比较。

于 2012-07-24T08:02:51.880 回答
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
    }

    }
}
于 2012-07-24T10:37:08.140 回答