2012-02-16 3 views
1

У меня есть база данных продуктов в XML. Для каждого продукта у меня есть ширина W, высота H и цена P.Как эффективно считать C# и XML?

Учитывая продукт с W, H и P, я хочу рассчитать количество продуктов с шириной меньше W и отдельные подсчеты для людей с высотой < H и цены с < P. Значение 3 независимых и независимых числа в результате подсчета.

Что такое эффективный способ использования C#? Очевидно, что я хочу пройти каждый элемент в XML-файле только один раз.

XML файл состоит из следующих узлов и считаны в XDocument объекта:

<product><name>abc</name><W>7</W><H>3</H><P>40</P></product> 
+1

может привести пример вашего XML? Ваша структура уже исправлена ​​или вы ее создаете? –

+0

Я добавил образец узла. Все узлы фиксированы и существуют в файле. – RJIGO

ответ

2

Что-то, как это будет работать

XDocument doc = XDocument.Parse(xml); 

    int heightCount = 0; 
    int widthCount = 0; 
    int priceCount = 0; 

    int heightThreshold = 3; 
    int widthThreshold = 1; 
    int priceThreshold = 1; 

    foreach (var product in doc.Descendants("product")) 
    { 
    int height = Convert.ToInt32(product.Element("H").Value); 
    int width = Convert.ToInt32(product.Element("W").Value); 
    int price = Convert.ToInt32(product.Element("P").Value); 

    if (height < heightThreshold) 
    { 
     heightCount++; 
    } 

    if (width < widthThreshold) 
    { 
     widthCount++; 
    } 

    if (price < priceThreshold) 
    { 
     priceCount++; 
    }  
    } 

Это не имеет гарантий, так что если ваш продукт элемент не содержит целочисленное значение для каждого из элементов H, W и P (или один из этих элементов не существует), он сломается. Вам нужно будет добавить некоторую нуль и проверку конверсии.

2
var doc=XDocument.Parse(@" 
    <products> 
     <product> 
      <name>abc</name> 
      <W>7</W> 
      <H>3</H> 
      <P>40</P> 
     </product> 
     <product> 
      <name>abc</name> 
      <W>5</W> 
      <H>3</H> 
      <P>40</P> 
     </product> 
     <product> 
      <name>abc</name> 
      <W>6</W> 
      <H>3</H> 
      <P>40</P> 
     </product> 
    </products>"); 

int w=7,h=3,p=40; 


var totals = doc 
    .Root 
    .Elements("product") 
    .Aggregate(
     Tuple.Create(0,0,0), 
     (acc,el) => 
      Tuple.Create(
       acc.Item1 + (((int)el.Element("W")) < w ? 1 : 0), 
       acc.Item2 + (((int)el.Element("H")) < h ? 1 : 0), 
       acc.Item3 + (((int)el.Element("P")) < p ? 1 : 0) 
      ) 
    ); 

бы дать результат кортежа со значением:

2, 0, 0 
Смежные вопросы