2016-01-19 20 views
5

XMLファイルとオブジェクトモデルを逆シリアル化しています。これは実際のモデルではありませんが、以下は私のものと構造が似ています。ネストされたオブジェクトから値の異なるリストを取得

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

} 

SelectedCar.Color値の別のリストを取得しようとしていますが、失敗しました。

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

私は明らかに間違って何かを、私は探しています何を達成するためにどのように明確ではないですしています:のは、私は自動車車体という変数にデータを格納しています、私は次のバリエーションを試してみましたと仮定しよう。

答えて

2

を参照してください。この

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

迅速で正確な回答をいただきありがとうございます。これは完全に機能しました! –

5

SelectMany()メソッドは、複数の配列(実際にはIEnumerable<T>を実装するもの)を1つの配列に投影するためのものです。例えば

、あなたがAutoBody項目のリストを持った、あなたは、単一のアレイにそれらに関連Vehiclesの全てを蓄積したい場合、あなたはどうなる:

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

しかし、あなたはSelectManyを使用していますstringプロパティ(あなたのケースでColor)に、あなたは基本的にIEnumerable<char>stringを投影している(それは実際には文字のシーケンスだからString以来IEnumerable<char>を実装ん)。

は代わりにSelect()を使用してみてください:

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

MSDN

+0

を試してみての情報や説明をいただき、ありがとうございます。 –

関連する問題