2

以下代码有效,但我想完成相同的结果,即通过一个查询将元素“triptype”和“description”的不同值插入到列表中。任何帮助将不胜感激。

在此先感谢,马塞洛

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();

    }
}
4

1 回答 1

2

AFAIK,当您尝试使用不同的值实现时,无法使用单个 LINQ to 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 ) );
于 2013-03-28T16:00:17.417 回答