从嵌套对象中获取不同的值列表
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>
的任何东西)投影到单个数组中。
例如,如果您有一个包含 AutoBody
个项目的列表,并且您想要将所有相关联的 Vehicles
累积到一个数组中,您可以这样做:
IEnumerable<Vehicles> vehicles = autoBodies.SelectMany(x => x.Vehicles);
但是,当您在 string
属性 上使用 SelectMany
(在您的情况下为 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; }
}
}
我正在将 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>
的任何东西)投影到单个数组中。
例如,如果您有一个包含 AutoBody
个项目的列表,并且您想要将所有相关联的 Vehicles
累积到一个数组中,您可以这样做:
IEnumerable<Vehicles> vehicles = autoBodies.SelectMany(x => x.Vehicles);
但是,当您在 string
属性 上使用 SelectMany
(在您的情况下为 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; }
}
}