//метод для заполнения данных public List <ITrade> FillData(List <string> lines) { List <ITrade> trades = new List <ITrade>(); int lineCount = 1; foreach (var line in lines) { if (line == null) { break; } string[] fields = line.Split(','); ValidationFields(fields, lineCount); bool amountTryParse = int.TryParse(fields[1], out int tradeAmount); bool priceTryPase = decimal.TryParse(fields[2], out var tradePrice); string sourceCurrencyCode = fields[0].Substring(0, 3); string destinationCurrencyCode = fields[0].Substring(3, 3); var lots = tradeAmount / LOTSIZE; var trade = new TradeRecord(destinationCurrencyCode, lots, tradePrice, sourceCurrencyCode); trades.Add(trade); lineCount++; } return(trades); }
public void HandleTrades(Stream stream, IReposytory reposytory) { this.stream = stream; TradeRecord trade = new TradeRecord(); this.reposytory = reposytory; StartTrade(trade); }
private IReposytory reposytory; //репозиторий, в который нужно будет закидывать данные, //их может быть несколько поэтому есть общий интерфейс //и потом при помощи полиморфного вызова вызывается //нужный метод #endregion #region Public Api public void HandleTrades(Stream stream) { this.stream = stream; TradeRecord trade = new TradeRecord(); reposytory = new DataBaseSqlTable(); StartTrade(trade); }
private TradeRecord GenerateNewTradeRecord(string sourceCurrencyCode, string destinationCurrencyCode, float tradeAmount, decimal tradePrice) { TradeRecord result = new TradeRecord { SourceCurrency = sourceCurrencyCode, DestinationCurrency = destinationCurrencyCode, Lots = tradeAmount / LOT_SIZE, Price = tradePrice }; return(result); }
// Использование итератора internal static IEnumerable <TradeRecord> Parther(IEnumerable <string> lines) { const float LOTSIZE = 100000f; int lineCount = 1; foreach (var line in lines) { var fields = line.Split(new char[] { ',' }); if (fields.Length != 3) { Logger($"WARN: Line {lineCount} malformed. Only {fields.Length} field(s) found."); continue; } if (fields[0].Length != 6) { Console.WriteLine("WARN: Trade currencies on line {0} malformed: '{1}'", lineCount, fields[0]); Logger($"WARN: Trade currencies on line {lineCount} malformed: '{fields[0]}'"); continue; } if (!int.TryParse(fields[1], out var tradeAmount)) { Console.WriteLine("WARN: Trade amount on line {0} not a valid integer: '{1}'", lineCount, fields[1]); Logger($"WARN: Trade amount on line {lineCount} not a valid integer: '{fields[1]}'"); } if (!decimal.TryParse(fields[2], out var tradePrice)) { Console.WriteLine("WARN: Trade price on line {0} not a valid decimal: '{1}'", lineCount, fields[2]); Logger($"WARN: Trade price on line {lineCount} not a valid decimal: '{fields[2]}'"); } string sourceCurrencyCode = fields[0].Substring(0, 3); string destinationCurrencyCode = fields[0].Substring(3, 3); lineCount++; var trade = new TradeRecord { SourceCurrency = sourceCurrencyCode, DestinationCurrency = destinationCurrencyCode, Lots = tradeAmount / LOTSIZE, Price = tradePrice }; yield return(trade); } }
// SRP applying public IEnumerable <TradeRecord> GetRecords() { var trades = new List <TradeRecord>(); int lineCount = 1; foreach (var line in GetLines()) { string[] fields = line.Split(new char[] { ',' }); if (fields.Length != 3) { System.Console.WriteLine("WARN: Line {0} malformed. Only {1} field(s) found.", lineCount, fields.Length); continue; } if (fields[0].Length != 6) { System.Console.WriteLine("WARN: Trade currencies on line {0} malformed: '{1}'", lineCount, fields[0]); continue; } if (!int.TryParse(fields[1], out var tradeAmount)) { System.Console.WriteLine("WARN: Trade amount on line {0} not a valid integer: '{1}'", lineCount, fields[1]); } if (!decimal.TryParse(fields[2], out var tradePrice)) { System.Console.WriteLine("WARN: Trade price on line {0} not a valid decimal: '{1}'", lineCount, fields[2]); } var sourceCurrencyCode = fields[0].Substring(0, 3); var destinationCurrencyCode = fields[0].Substring(3, 3); var trade = new TradeRecord { SourceCurrency = sourceCurrencyCode, DestinationCurrency = destinationCurrencyCode, Lots = tradeAmount / LotSize, Price = tradePrice }; trades.Add(trade); lineCount++; } return(trades); }
// Save exact trade private void SaveTrade(TradeRecord trade, SqlTransaction transaction, SqlConnection connection) { var command = connection.CreateCommand(); command.Transaction = transaction; command.CommandType = System.Data.CommandType.StoredProcedure; command.CommandText = "dbo.Insert_Trade"; command.Parameters.AddWithValue("@sourceCurrency", trade.SourceCurrency); command.Parameters.AddWithValue("@destinationCurrency", trade.DestinationCurrency); command.Parameters.AddWithValue("@lots", trade.Lots); command.Parameters.AddWithValue("@price", trade.Price); command.ExecuteNonQuery(); }
// Separate record method private void AddRecord(IReadOnlyList <string> fields, int tradeAmount, decimal tradePrice) { var sourceCurrencyCode = fields[0].Substring(0, 3); var destinationCurrencyCode = fields[0].Substring(3, 3); var trade = new TradeRecord { SourceCurrency = sourceCurrencyCode, DestinationCurrency = destinationCurrencyCode, Lots = tradeAmount / LOT_SIZE, Price = tradePrice }; trades.Add(trade); }
private IEnumerable <TradeRecord> Parse(IEnumerable <string> tradeRecords) { int NumberOfTreads = 0; List <TradeRecord> buf = new List <TradeRecord>(); IParser parser = new Parser(); ILogger logger = new Logger(); foreach (var line in tradeRecords) { string[] fields = line.Split(new char[] { ',' }); TradeRecord tradeRecord = null; try { tradeRecord = parser.Parse(fields); } catch (FieldLengthException) { logger.Warn($"WARN: Trade length on line {NumberOfTreads} is: '{fields.Length}'"); continue; } catch (CurrencyException) { logger.Warn($"WARN: Trade currencies on line {NumberOfTreads} malformed: '{fields[0]}'"); continue; } catch (TradeAmountException) { logger.Warn($"WARN: Trade amount on line {NumberOfTreads} not a valid integer: '{fields[1]}'"); continue; } catch (TradePriceException) { logger.Warn($"WARN: Trade price on line {NumberOfTreads} not a valid decimal: '{fields[2]}'"); continue; } buf.Add(tradeRecord); NumberOfTreads++; } logger.Info($"INFO: {NumberOfTreads} trades processed"); return(buf); }
internal static List <TradeRecord> CreateRecords(List <string> lines) { List <TradeRecord> trades = new List <TradeRecord>(); foreach (var line in lines) { string[] fields = line.Split(new char[] { ',' }); if (fields.Length != 3) { Console.WriteLine("WARN: Line malformed. Only {0} field(s) found.", fields.Length); continue; } if (fields[0].Length != 6) { Console.WriteLine("WARN: Trade currencies malformed: '{0}'", fields[0]); continue; } if (!int.TryParse(fields[1], out var tradeAmount)) { } if (!decimal.TryParse(fields[2], out var tradePrice)) { } string sourceCurrencyCode = fields[0].Substring(0, 3); string destinationCurrencyCode = fields[0].Substring(3, 3); TradeRecord trade = new TradeRecord { SourceCurrency = sourceCurrencyCode, DestinationCurrency = destinationCurrencyCode, Lots = tradeAmount / _lotSize, Price = tradePrice }; trades.Add(trade); } return(trades); }
public static List <TradeRecord> CreateTradeList(List <string> lines) { var trades = new List <TradeRecord>(); int lineNumber = 0; foreach (var line in lines) { lineNumber++; var field = line.Split(new char[] { ',' }); //проверка на заполнение полей if (!CheckFields(field, lineNumber)) { continue; } //Не придумал как это обыграть if (!int.TryParse(field[1], out var tradeAmount)) { Console.WriteLine($"WARN: Trade amount on line {lineNumber} not a valid integer: '{field[1]}'"); } if (!decimal.TryParse(field[2], out var tradePrice)) { Console.WriteLine($"WARN: Trade price on line {lineNumber} not a valid decimal: '{field[2]}'"); } TradeRecord trade = new TradeRecord { SourceCurrency = field[0].Substring(0, 3), DestinationCurrency = field[0].Substring(3, 3), Lots = tradeAmount / 100000f, Price = tradePrice }; trades.Add(trade); } return(trades); }
public TradeRecord Parse(string[] fields) { IValidator validator = new Validator(); try { validator.Validate(fields); } catch (FieldLengthException) { throw; } catch (CurrencyException) { throw; } catch (TradeAmountException) { throw; } catch (TradePriceException) { throw; } int tradeAmount = int.Parse(fields[1]); decimal tradePrice = decimal.Parse(fields[2], new CultureInfo("en-US")); var trade = new TradeRecord { SourceCurrency = fields[0].Substring(0, 3), DestinationCurrency = fields[0].Substring(3, 3), Lots = tradeAmount / TradeService.LotSize, Price = tradePrice }; return(trade); }
// Разделил на 2 метода валидацию и на получение трейдов private void GetTrades(List <TradeRecord> trades, List <string> lines) { var lineCount = 1; foreach (var line in lines) { var fields = line.Split(new char[] { ',' }); if (Valiation(fields, lineCount, out var tradeAmount, out var tradePrice)) { var sourceCurrencyCode = fields[0].Substring(0, 3); var destinationCurrencyCode = fields[0].Substring(3, 3); var trade = new TradeRecord(destinationCurrencyCode, sourceCurrencyCode, tradeAmount / LotSize, tradePrice); trades.Add(trade); } lineCount++; } }
public static void Save(TradeRecord trade, string connectionString) { using (var connection = new SqlConnection(connectionString)) { connection.Open(); using (var transaction = connection.BeginTransaction()) { var command = connection.CreateCommand(); command.Transaction = transaction; command.CommandType = System.Data.CommandType.StoredProcedure; command.CommandText = "dbo.Insert_Trade"; command.Parameters.AddWithValue("@sourceCurrency", trade.SourceCurrency); command.Parameters.AddWithValue("@destinationCurrency", trade.DestinationCurrency); command.Parameters.AddWithValue("@lots", trade.Lots); command.Parameters.AddWithValue("@price", trade.Price); command.ExecuteNonQuery(); transaction.Commit(); } connection.Close(); } }