2014-01-11 7 views
2

Привет, я работаю над созданием XmlDocument с данными о продуктах. Мой кодСоздание XmlDocument без цикла

foreach (var pv in pvs) 
{ 
    XmlElement product = xml.CreateElement("Product"); 
    product.SetAttribute("SKU", pv.Sku); 
    root.AppendChild(product);   

    var pname = xml.CreateElement("Name"); 
    pname.InnerText = pv.Product.Name; 

    product.AppendChild(pname); 

    var MRP = xml.CreateElement("Mrp"); 

    MRP.InnerText = Math.Round(pv.OldPrice, 2).ToString(); 

    var SKU_MRP = _barcodeService.GetMRPsBySku(pv.Sku); 

    var mrps = SKU_MRP.AsEnumerable().Select(s => s.MRP).ToList(); 

    if (mrps.Count > 0) 
    {  
     mrpstring = string.Join<string>(",", mrps.Select(x => Math.Round(x, 2).ToString()).Where(x => x != Math.Round(pv.OldPrice, 2).ToString()).ToList()); 
    } 

    if (!string.IsNullOrEmpty(mrpstring)) 
    { 
     MRP.InnerText += "," + mrpstring; 
    } 
    product.AppendChild(MRP); 
} 

xml.Save(path); 

Над кодом, который я вставил, является лишь частью всей моей функции. Обратите внимание, что я вызываю метод из моей функции barcodeservice, которая возвращает IList.

Кол-во pv превышает 5000. Таким образом, для создания полного файла было сделано 5-7 минут. Теперь есть ли какое-либо обходное решение для минимизации нагрузки или как я могу сгенерировать такой же файл без использования foreach.

Любые решения?

ответ

3

Если вам нужно сгенерировать большой файл xml, используйте XmlWriter вместо XmlDocument. XmlDocument создает представление xml в памяти, прежде чем вы сможете сохранить его в файл. XmlWriter записывает данные непосредственно в файл.

С XmlWriter ваш цикл будет выглядеть следующим образом:

using(XmlWriter writer = XmlWriter.Create(fileName)) 
{ 
    writer.WriteStartDocument(); 
    writer.WriteStartElement("Products"); 

    foreach (var pv in pvs) 
    { 
     writer.WriteStartElement("Product"); 
     writer.WriteAttributeString("SKU", pv.Sku); 
     writer.WriteElementString("Name", pv.Product.Name);   
     // ... 
     writer.WriteEndElement(); 
    } 

    writer.WriteEndElement(); 
    writer.WriteEndDocument(); 
} 

Также вы можете оптимизировать mrpstring создание (если цена сохраняется в виде десятичного значения):

decimal oldPrice = Math.Round(pv.OldPrice, 2); 
var SKU_MRP = _barcodeService.GetMRPsBySku(pv.Sku); 
var newPrices = SKU_MRP.AsEnumerable() 
         .Select(s => Math.Round(s.MRP, 2)) 
         .Where(mrp => mrp != oldPrice); 

mrpstring = String.Join(",", newPrices); 

Таким образом, вам нужно только перечислить новые цены, то вам не нужно сохранять их в списке, также вам не нужно проверять счет, потому что если нет ничего, чтобы присоединиться, join вернет пустую строку. Кроме того, если вы используете decimals по цене, то не следует преобразовывать их в строки или рассматривать округление только при создании mrpstring.

+0

это поможет вам сэкономить время? хорошо, я дам ему попробовать –

+0

@NitinVarpe да, это будет быстрее также –

+1

Thanx для ура полезное предложение, и еще одна вещь, которую вы не должны быть похожими на изображение на картинке для «Хороший дизайн, как произведение искусства» на вашем блог http://fundd.blogspot.in/ –

Смежные вопросы