[英]Get Distinct List of Values from Nested Object
我將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值列表,並且不成功。 讓我們假設我將數據存儲在一個名為autoBody的變量中,我嘗試過以下變體:
List<char> uniqueColors = autoBody.SelectMany(auto => auto.SelectedCar.Color).Distinct().ToList();
我顯然做錯了什么,但我不清楚如何實現我正在尋找的東西。
SelectMany()
方法用於將多個數組(實際上是實現IEnumerable<T>
任何數組SelectMany()
投影到單個數組中。
例如,如果您有一個AutoBody
項目列表,並且您想將所有關聯的Vehicles
累積到一個陣列中,您可以:
IEnumerable<Vehicles> vehicles = autoBodies.SelectMany(x => x.Vehicles);
但是,當你使用SelectMany
在string
屬性( Color
在你的情況下),你基本上投射string
入IEnumerable<char>
(因為String
確實實現IEnumerable<char>
,因為它實際上是一個字符序列)。
嘗試使用Select()
代替:
List<string> uniqueColors = autoBody.Select(auto => auto.SelectedCar.Color)
.Distinct()
.ToList()
請參閱MSDN
試試這個
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; }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.