2016-01-19 2 views
5

Ich Deserialisierung eine XML-Datei zu und Objektmodell. Obwohl dies nicht das tatsächliche Modell ist, ist unten in der Struktur ähnlich, was ich habe.Get Distinct Liste von Werten aus verschachtelten Objekt

[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; } 

} 

Ich versuche, eine eindeutige Liste der SelectedCar.Color-Werte zu erhalten und war nicht erfolgreich. Nehmen wir an, dass ich die Daten in einer Variablen am Speicherung Karosserie- genannt, ich habe versucht, Variationen der folgenden Möglichkeiten:

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

ich eindeutig etwas falsch bin, aber ich bin nicht klar, wie man das erreichen, was ich suche.

Antwort

2

Versuchen Sie, diese

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

Vielen Dank für die schnelle (und genaue) Antwort. Das hat perfekt funktioniert! –

5

Die Methode SelectMany() ist für die Projektion mehrerer Arrays (eigentlich alles, was IEnumerable<T> implementiert) in ein einzelnes Array gedacht.

Zum Beispiel, wenn Sie eine Liste der AutoBody Elemente aufwiesen, wurden und Sie alle ihre zugehörigen Vehicles in einen einzelnen Array sammeln wollten, würden Sie tun:

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

Aber, wenn Sie SelectMany verwenden auf einer string Eigenschaft (Color in Ihrem Fall), projizieren Sie im Grunde die string in eine IEnumerable<char> (seit StringhatIEnumerable<char> implementieren, da es tatsächlich eine Folge von Zeichen ist).

Versuchen Sie es mit Select() statt:

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

Siehe MSDN

+0

Danke für die Information und Erklärung. –

Verwandte Themen