如何访问另一个<list>?</list> </list>中的<list>

时间:2014-07-03 06:08:00

标签: c# serialization

我很难弄清楚如何使用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; }
}

4 个答案:

答案 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")));

这将给出输出:

enter image description here

注意:如果您有2名学生,1名学生有4辆车,另一名有2辆车,输出将变为:

enter image description here

这是因为我们首先要对学生进行迭代,然后再对汽车进行迭代。 当你看到每个学生的汽车,你可以嵌套你的foreach。你的foreach将会是这样的:

 root.p.ForEach(p =>
   {
       Console.WriteLine("Item in 1");
       p.c.ForEach(c => Console.WriteLine("  Item in 2"));

   });

然后你的输出将是:

enter image description here

所以,相当长的帖子,但我希望它有所帮助。