Как запросить Мин и Макс из XML? - PullRequest
1 голос
/ 01 октября 2010
<?xml version="1.0" encoding="utf-8"?>
<Customers>
   <Customer Id="1">
    <Name>rtertr</Name>
    <DOB>2010-12-12T00:00:00</DOB>
    <EMail>werer@test.com</EMail>
  </Customer>
  <Customer Id="2">
    <Name>west</Name>
    <DOB>0001-01-01T00:00:00</DOB>
    <EMail>west@test.com</EMail>
   </Customer> 
  <Customer Id="3">
    <Name>west</Name>
    <DOB>0001-01-01T00:00:00</DOB>
    <EMail>west@test.com</EMail>
   </Customer> 
</Customers>

Как найти минимальный и максимальный CustomerId из приведенного выше образца XML с использованием LinQ to XML?Например, для приведенного выше примера, Мин должен быть 1 и Макс должен быть 3

Ответы [ 2 ]

2 голосов
/ 01 октября 2010
var doc = XDocument.Parse(...);

//.ToArray() so we only iterate once
var ids = doc.Root.Elements("Customer").Select(c => (int)c.Attribute("Id")).ToArray();
var minId = ids.Min();
var maxId = ids.Max();

Как сказано в комментарии dtb, это будет повторять массив дважды, но только один раз XML-документ.Я чувствую, что это хороший компромисс между удобочитаемостью и производительностью - по крайней мере, когда он не используется в рабочем коде.Итерация массива int будет небольшим фактором итерации документа xml.Лучшее решение состоит в том, чтобы выполнить итерацию документа только один раз и отслеживать значения по пути, как показывает dtb.

1 голос
/ 01 октября 2010

Вы можете использовать методы расширения Min и Max :

var doc = XDocument.Parse("<Customers>...</Customers>");

var minId = doc.Root.Elements().Min(e => (int)e.Attribute("Id"));
var maxId = doc.Root.Elements().Max(e => (int)e.Attribute("Id"));

или метод расширения Aggregate (повторение документа XMLтолько один раз):

var doc = XDocument.Parse("<Customers>...</Customers>");

var result = doc.Root
                .Elements()
                .Select(e => (int)e.Attribute("Id"))
                .Aggregate(
                    Tuple.Create(int.MinValue, int.MaxValue),
                    (t, x) => Tuple.Create(Math.Max(t.Item1, x),
                                           Math.Min(t.Item2, x)));

var maxId = result.Item1;
var minId = result.Item2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...