我很难弄清楚如何使用ForEach
(或不使用它)来打印Car
列表中的Parent
列表。我知道显然我不能XmlData.p.b.ForEach
并且下面的代码只是一个例子,因为我将不得不做很多操作,但我只需要知道我怎么做访问列表中的b列表。
public static void Main(string[] args)
{
XmlSerializer deserializer = new XmlSerializer(typeof(Address));
TextReader reader = new StreamReader("myXML.xml");
object obj = deserializer.Deserialize(reader);
Address XmlData = (Address)obj;
reader.Close();
XmlData.p.ForEach(p => Console.WriteLine("Item in p!");
XmlData.p.b.ForEach(b => Console.WriteLine("Item in b!"); // can't do this
}
XML格式:
顶部:MyRoot
----------目标
-----------------父
----------------------------汽车
[XmlRoot("MyRoot")]
public class MyRoot
{
[XmlElement("Dealership")]
public String dealership;
[XmlElement("ZipCode")]
public String zipCode;
[XmlArray("Targets")]
[XmlArrayItem("Parent")]
public List<Parent> p = new List<Parent>();
}
public class Parent : Student
{
[XmlElement("ParentName")]
public String parentName { get; set; }
}
public class Student
{
[XmlElement("Owner")]
public String owner { get; set; }
[XmlElement("Age")]
public String age { get; set; }
[XmlElement("Name")]
[XmlArrayItem("Cars")]
public List<Cars> c = new List<Cars>();
}
public class Cars
{
[XmlElement(Namespace="BuildDependency/CarYear")]
public String carYear { get; set; }
[XmlElement(Namespace = "BuildDependency/CarMake")]
public String carMake { get; set; }
[XmlElement(Namespace = "BuildDependency/CarModel")]
public String carModel { get; set; }
[XmlElement("CarColor")]
public String carColor { get; set; }
[XmlElement("CarMileage")]
public String carMileage { get; set; }
}
答案 0 :(得分:1)
您可以使用SelectMany
平整列表:
XmlData.p.SelectMany(p => p.b).ToList()
.ForEach(b => Console.WriteLine("Item in b!"));
答案 1 :(得分:1)
如果你希望迭代一个容易在另一个列表中的列表,你可以在第一个列表迭代范围内完成它,例如(不会使用lambda表达式而是使用标准循环来保持简单):
for(int i=0; i<XmlData.p.Length; i++) {
Console.WriteLine("Item in a!");
for(j=0; j<XmlData.p[i].b.Length; j++) {
Console.WriteLine("Item in b!");
}
}
答案 2 :(得分:0)
或者你可以嵌套第二个ForEach电话:
XmlData.p.ForEach(outer => outer.b.ForEach(inner => Console.WriteLine("Item in b!")));
答案 3 :(得分:0)
很明显,这样做很有效,你的代码需要进行调整,以便b进入foreach类。
你的第二个电话(迭代列表中的列表)应该是:
XmlData.p.ForEach(p => p.c.ForEach(c => { Console.WriteLine("Item in C"); }));
我写了一个非常小的演示项目,我将分享:
首先使项目有效的一些类:
public class MyRoot
{
public List<Student> p = new List<Student>();
}
public class Student
{
public List<Cars> c = new List<Cars>();
}
public class Cars
{
public String carYear { get; set; }
public String carMake { get; set; }
public String carModel { get; set; }
public String carColor { get; set; }
public String carMileage { get; set; }
}
然后是initiazization:
var cars = new List<Cars>();
cars.Add(new Cars());
cars.Add(new Cars());
cars.Add(new Cars());
cars.Add(new Cars());
var student = new List<Student>();
student.Add(new Student() { c = cars });
var root = new MyRoot();
root.p = student;
所以我们用4辆车创造了4辆汽车和1名学生。 在根对象中,我们将学生列表设置为只有1名学生和4辆车。
所以我们有以下情况:
-- Root
-- Student
-- Car
-- Car
-- Car
-- Car
现在,要迭代它,您需要执行以下操作:
root.p.ForEach(p => Console.WriteLine("Item in 1"));
root.p.ForEach(p => p.c.ForEach(c => Console.WriteLine(" Item in 2")));
这将给出输出:
注意:如果您有2名学生,1名学生有4辆车,另一名有2辆车,输出将变为:
这是因为我们首先要对学生进行迭代,然后再对汽车进行迭代。 当你看到每个学生的汽车,你可以嵌套你的foreach。你的foreach将会是这样的:
root.p.ForEach(p =>
{
Console.WriteLine("Item in 1");
p.c.ForEach(c => Console.WriteLine(" Item in 2"));
});
然后你的输出将是:
所以,相当长的帖子,但我希望它有所帮助。