2013-03-28 3 views
2

Следующий код работает, но я хотел бы выполнить тот же результат, который вставляет в список отдельные значения элементов «triptype» и «description» с одним единственным запросом. Любая помощь будет оценена.добавить несколько значений элементов xml в список

Спасибо заранее, Марсело

class Program 
{ 
    static void Main(string[] args) 
    { 
     string xml = @"<Trips> 
         <Trip> 
         <triptype>vacation</triptype> 
         <description>Trip to Bahamas</description> 
         <id>89</id> 
         </Trip> 
         <Trip> 
         <triptype>vacation</triptype> 
         <description>Trip to California</description> 
         <id>75</id> 
         </Trip> 
         <Trip> 
         <triptype>business</triptype> 
         <description>Trip to Chicago</description> 
         <id>82</id> 
         </Trip> 
        </Trips>"; 

     List<string> trips = new List<string>(); 

     XDocument xdoc = XDocument.Parse(xml); 

     var tripTypes = (from t in xdoc.Descendants("Trip") 
          .Elements("triptype") 
         select t.Value).Distinct(); 

     foreach (var tripType in tripTypes) 
     { 
      trips.Add(tripType); 
     } 

     var tripDescriptions = (from t in xdoc.Descendants("Trip") 
            .Elements("description") 
           select t.Value).Distinct(); 

     foreach (var tripDescription in tripDescriptions) 
     { 
      trips.Add(tripDescription); 
     } 

     Console.ReadLine(); 

    } 
} 

ответ

2

AFAIK, нет никакого способа, чтобы выбрать несколько элементов с одним LINQ к XML-запроса, как вы пытаетесь достичь с помощью различных значений.

Однако, вы можете проецировать последовательность в анонимный тип со значением каждого элемента, а затем найти различные значения, но я подозреваю, что, вероятно, будет излишним и труднее понять, чем то, что вы делаете сейчас, то есть,

var query = xdoc.Root.Elements("Trip") 
     .Select(x => new 
         { 
           trip = x.Element("triptype").Value, 
           desc = x.Element("description").Value 
         }).ToList(); 

trips.AddRange(query.Select(x => x.trip).Union(query.Select(x => x.desc)).Distinct()); 

Скорее всего, я хотел бы предложить небольшую очистку с помощью List.AddRange вместо foreach цикла и использовать ту же логику, которую вы используете в настоящее время, получая каждый определенный набор значений для каждого узла, необходимый:

var q1 = xdoc.Descendants("triptype").Select(x => x.Value).Distinct(); 
var q2 = xdoc.Descendants("description").Select(x => x.Value).Distinct(); 
trips.AddRange(q1.Union(q2)); 
+0

Отлично! Вы правы, используя List.AddRange - намного более чистое решение. Это именно то, что я искал. Спасибо огромное! – mcampos

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