2016-01-19 14 views
5

Sto deserializzando un file XML e un modello a oggetti. Sebbene questo non sia il modello attuale, di seguito è simile nella struttura a ciò che ho.Ottieni distinto elenco di valori dall'oggetto nidificato

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

} 

Sto cercando di ottenere un elenco distinto di valori SelectedCar.Color e non sono riuscito. variazioni Supponiamo che io sia l'archiviazione dei dati in una variabile chiamata carrozzerie, ho provato la seguente:

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

Sto chiaramente facendo qualcosa di sbagliato, ma non mi è chiaro su come realizzare quello che sto cercando.

risposta

2

Prova questa

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

Grazie per la risposta rapida (e accurata). Questo ha funzionato perfettamente! –

5

Il metodo SelectMany() è pensato per la proiezione di più array (in realtà qualsiasi cosa che implementa IEnumerable<T>) in un singolo array.

Per esempio, se si dovesse avere un elenco di elementi AutoBody e di voler accumulare tutti i loro associati Vehicles in un singolo array, si dovrebbe fare:

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

Ma, quando si utilizza SelectMany su un string proprietà (Color nel tuo caso), si sta fondamentalmente proiettando il string in un IEnumerable<char> (dal Stringfa attuare IEnumerable<char> perché è in realtà una sequenza di caratteri).

Provare a utilizzare Select() invece:

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

Vedi MSDN

+0

Grazie per le informazioni e le spiegazioni. –

Problemi correlati