2012-07-24 8 views
6

estoy creando aC# ventanas aplicación para mostrar los tipos de mercado deportivas actuales utilizando el intercambio de Betfair servicio web, he utilizado la¿Alguien tiene código C# para usar betfair api?

getmarketpricescompressed()

método que devuelve una cadena de precio que tiene este aspecto:

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~ 

no sé cómo se puede desempaquetar correctamente esta cadena, por ahora estoy utilizando este código:

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]; 
      } 

Funciona bien para algunas coincidencias, pero observé los cambios de cadena para algunas otras coincidencias y, por lo tanto, genera excepciones, ¿Puede alguien ayudarme con un código adecuado para descomprimir esta cadena, lo he buscado en Google y encontrado un código VB, que no era muy útiles,

y por cierto, quiero organizar los datos en algo como esto:

enter image description here

+0

El método devuelve una cadena de precio que se parece a una URL larga Google? – Jodrell

+0

oh Dios mío, lo siento, eso fue un error, lo corregí de verdad: 3 –

+0

¿Qué problema tenía el (presumiblemente) código VB.NET? Si realmente era VB.NET, es fácilmente convertible a C# con un poco de conocimiento. =) Además, considere publicar su segunda pregunta como una segunda pregunta real. =) –

Respuesta

2

sólo una suposición, creo que los datos son organizados así

primera delimitada por : continuación | obtenemos

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 ~~~ falsa ~~~~ 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 1.171,77 ~ B ~ 2 ~ 1,88 ~ 169.15 ~ B ~ 3 ~

Creo que la primera fila es claramente una cabecera, que el primer número es el ID de mercado tal vez. Del mismo modo, la primera parte de cada sección posterior es un identificador de fila.Delimitada por ~ algo así como

(SelectionId) 7337 (orden) 1 (TotalMatched?) 6992.56 (EvenPoint) 2,16 (???) falsa

creo que las filas de precios están delimitados por ~ en tuplas de 4, como esto

(Precio) 2,16 (MatchAvailable) 1036.19 (Tipo) L (orden) 1
(Precio) 2,14 (MatchAvailable) 0.097,18 (Tipo) L (orden) 2 (
Precio) 2.12 (Coincidencia Disponible) 0005.00 (Tipo) L (Pedido) 3

por ejemplo.

Para probar mis conjeturas tendré que comparar con la representación de BetFair en su sitio web.

+0

De acuerdo con la documentación, eso es lo correcto. =) –

+0

Claramente, eso está tan cerca como podría estar con los datos originales que se muestran en el sitio web, el (Precio) y (Coincidencia Disponible) son como se muestran en el sitio web, –

3

considerar lo siguiente:

a|b|c|d 

En esto, tiene cuatro pedazos. Pero no necesariamente tiene que ser solo cuatro. Puede ser dos, puede ser seis.

trate de ir a él por iteración la cadena de matriz que se obtiene como resultado de la Algo

string[] ab1 = prices.Split('|'); 

como

foreach(var stringChunk in ab1) 
{ 
    string[] temp = stringChunk.Split('~'); 
    // use the strings here as you please 
} 

considerar usar un enfoque más dinámico en la presentación de sus datos, así, utilizando un control repetitivo basado en filas en lugar de cuadros de texto estáticos. =)

La documentación completa de los datos comprimidos está disponible aquí: https://docs.developer.betfair.com/betfair/#!page=00008360-MC.00008307-MC

+0

Bueno, esto parece legítimo, pero ¿y si tuviera que mostrar los datos analizados en las etiquetas, entonces tendría que generar y posicionar esas etiquetas dinámicamente ...... pero supongo que vale la pena intentarlo .... thanxx –

2

que convierte el código de VB a C# yo, si alguien que le resulte útil, estoy publicando aquí:

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 
    } 

    } 
} 
Cuestiones relacionadas