2016-01-19 27 views
5

Próbuję deserializacji pliku XML i modelu obiektu. Chociaż nie jest to rzeczywisty model, poniżej jest podobna struktura do tego, co mam.Uzyskaj wyraźną listę wartości z obiektu zagnieżdżonego

[Serializable()] 
[System.Xml.Serialization.XmlRoot("AutoEnvelope")] 
public class AutoBody 
{ 
    [XmlArray("AutoBody")] 
    [XmlArrayItem("Vehicles", typeof(Vehicles))] 
    public Vehicles[] Vehicles { get; set; } 

} 

[Serializable()] 
public class Vehicles 
{ 
    [XmlElement("SelectedCar", typeof(SelectedCar))] 
    public SelectedCar SelectedCar { get; set; } 

    [XmlElement("OfferedVehicles", typeof(OfferedVehicles))] 
    public OfferedVehicles OfferedVehicles { get; set; } 

} 

[Serializable()] 
public class SelectedCar 
{ 
    [System.Xml.Serialization.XmlElement("Model")] 
    public string Model { get; set; } 

    [System.Xml.Serialization.XmlElement("NumTires")] 
    public int NumTires { get; set; } 

    [System.Xml.Serialization.XmlElement("Color")] 
    public string Color { get; set; } 

} 

Próbuję uzyskać odrębną listę wartości SelectedCar.Color i nie udało się. Załóżmy, że mam przechowywania danych w zmiennej o nazwie Autobody próbowałem wariacje z następujących powodów:

List<char> uniqueColors = autoBody.SelectMany(auto => auto.SelectedCar.Color).Distinct().ToList(); 

ja wyraźnie robi coś złego, ale nie jestem jasne, w jaki sposób osiągnąć to, czego szukam.

Odpowiedz

2

Spróbuj

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Serialization; 

namespace ConsoleApplication70 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      AutoBody bodies = new AutoBody() 
      { 
       vehicles = new List<Vehicles>() 
       { 
        new Vehicles() { 
         SelectedCar = new SelectedCar() { Model = "Ford", NumTires = 1, Color = "red"} 
        }, 
        new Vehicles() { 
         SelectedCar = new SelectedCar() { Model = "Chevy", NumTires = 2, Color = "blue"} 
        }, 
        new Vehicles() { 
         SelectedCar = new SelectedCar() { Model = "Jeep", NumTires = 3, Color = "green"} 
        }, 
        new Vehicles() { 
         SelectedCar = new SelectedCar() { Model = "Merecedes", NumTires = 4, Color = "red"} 
        }, 
       } 
      }; 
      List<string> colors = bodies.vehicles.Select(x => x.SelectedCar).Select(y => y.Color).Distinct().ToList(); 

     } 
    } 
    [Serializable()] 
    [System.Xml.Serialization.XmlRoot("AutoEnvelope")] 
    public class AutoBody 
    { 
     [XmlArray("AutoBody")] 
     [XmlArrayItem("Vehicles", typeof(Vehicles))] 
     public List<Vehicles> vehicles { get; set; } 

    } 

    [Serializable()] 
    public class Vehicles 
    { 
     [XmlElement("SelectedCar", typeof(SelectedCar))] 
     public SelectedCar SelectedCar { get; set; } 

     //[XmlElement("OfferedVehicles", typeof(OfferedVehicles))] 
     //public OfferedVehicles OfferedVehicles { get; set; } 

    } 

    [Serializable()] 
    public class SelectedCar 
    { 
     [System.Xml.Serialization.XmlElement("Model")] 
     public string Model { get; set; } 

     [System.Xml.Serialization.XmlElement("NumTires")] 
     public int NumTires { get; set; } 

     [System.Xml.Serialization.XmlElement("Color")] 
     public string Color { get; set; } 

    } 
} 
+0

Dziękujemy za szybką (i dokładną) odpowiedź. To działało idealnie! –

5

Metoda SelectMany() jest przeznaczona do wyświetlania wielu tablic (w rzeczywistości wszystko, co implementuje IEnumerable<T>) w jedną tablicę.

Na przykład, jeśli mieli listę AutoBody przedmiotów i chciał zgromadzić wszystkie związane z nimi Vehicles w jednej tablicy, to zrobić:

IEnumerable<Vehicles> vehicles = autoBodies.SelectMany(x => x.Vehicles); 

Ale gdy używasz SelectMany na string własności (Color w Twoim przypadku), jesteś w zasadzie projekcji string w produkt IEnumerable<char> (od Stringma wdrożyć IEnumerable<char> bo to faktycznie ciągiem znaków).

Spróbuj użyć Select() zamiast:

List<string> uniqueColors = autoBody.Select(auto => auto.SelectedCar.Color) 
            .Distinct() 
            .ToList() 

Zobacz MSDN

+0

Dziękuję za informacje i wyjaśnienia. –