/// <summary>
 /// Writes a QuoteData to XML format
 /// </summary>
 /// <param name="writer">The used XML writer</param>
 /// <param name="quote">The used QuoteData</param>
 /// <param name="properties">The used properties of the quotes</param>
 /// <param name="culture">The used culture for formating dates and numbers. If parameter value is null/Nothing, default Culture will be used.</param>
 /// <remarks></remarks>
 public static void FromQuoteData(System.Xml.XmlWriter writer, QuotesData quote, IEnumerable <QuoteProperty> properties, System.Globalization.CultureInfo culture = null)
 {
     System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture;
     if (culture != null)
     {
         ci = culture;
     }
     writer.WriteStartElement("Quote");
     if (quote[QuoteProperty.Symbol] != null)
     {
         writer.WriteAttributeString("ID", quote[QuoteProperty.Symbol].ToString());
     }
     QuoteProperty[] prps = FinanceHelper.CheckPropertiesOfQuotesData(new QuotesData[] { quote }, properties);
     foreach (QuoteProperty qp in prps)
     {
         writer.WriteStartElement(qp.ToString());
         writer.WriteValue(MyHelper.ObjectToString(quote[qp], ci));
         writer.WriteEndElement();
     }
     writer.WriteEndElement();
 }
        /// <summary>
        /// Converts a list of quote data to a CSV formatted text
        /// </summary>
        /// <param name="quotes">The list of quote values</param>
        /// <param name="delimiter">The delimiter of the CSV text</param>
        /// <param name="properties">The used properties of the items</param>
        /// <param name="culture">The used culture for formating dates and numbers. If parameter value is null/Nothing, default Culture will be used.</param>
        /// <returns>The converted data string in CSV format</returns>
        /// <remarks></remarks>
        public static string FromQuotesData(IEnumerable <QuotesData> quotes, char delimiter, IEnumerable <QuoteProperty> properties, System.Globalization.CultureInfo culture = null)
        {
            if (quotes != null)
            {
                System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture;
                if (culture != null)
                {
                    ci = culture;
                }

                QuoteProperty[]           prpts = FinanceHelper.CheckPropertiesOfQuotesData(quotes, properties);
                System.Text.StringBuilder sb    = new System.Text.StringBuilder();

                foreach (QuoteProperty qp in prpts)
                {
                    sb.Append(qp.ToString());
                    sb.Append(delimiter);
                }
                sb.Remove(sb.Length - 1, 1);
                sb.AppendLine();

                foreach (QuotesData q in quotes)
                {
                    if (q != null)
                    {
                        System.Text.StringBuilder sbQ = new System.Text.StringBuilder();
                        foreach (QuoteProperty qp in prpts)
                        {
                            object o = MyHelper.ObjectToString(q[qp], ci);
                            if (o is string)
                            {
                                if (o.ToString() == string.Empty)
                                {
                                    sbQ.Append("\"N/A\"");
                                }
                                else
                                {
                                    sbQ.Append("\"");
                                    sbQ.Append(q[qp].ToString().Replace("\"", "\"\""));
                                    sbQ.Append("\"");
                                }
                            }
                            else
                            {
                                sbQ.Append(MyHelper.ObjectToString(q[qp], ci));
                            }
                            sbQ.Append(delimiter);
                        }
                        if (sbQ.Length > 0)
                        {
                            sbQ.Remove(sbQ.Length - 1, 1);
                        }
                        sb.AppendLine(sbQ.ToString());
                    }
                }
                return(sb.ToString());
            }
            else
            {
                return(string.Empty);
            }
        }