如何连接2个列表

时间:2017-01-24 10:17:08

标签: c# xml linq list parsing

我不确定这是不是一件简单的事情。

我的XML文件是这样构建的:

<DEFTABLE>
  <CUBE NAME="FristCube" />
      <OUT NAME="Line1" />
      <OUT NAME="Line2" />
      <IN NAME="LineX" />
      <IN NAME="LineY" />
  </CUBE>
  <CUBE NAME="SecondCube" />
      <OUT NAME="LineX" />
      <OUT NAME="LineY" />
      <IN NAME="Line1" />
      <IN NAME="Line2" />
  </CUBE>
</DEFTABLE>

现在我创建了一个包含所有多维数据集名称的列表,一个包含所有内联列表的列表和一个包含所有OutLines的列表。 正如您所看到的,一个Cube可以有多个InLines和OutLines - 我如何将它们匹配在一起?

我想我需要一个班级&#34; Cube&#34;包括所有内线和外线,但我不知道如何实现这一点。

我想创建CubeList的3D对象(在Unity中)并使用正确的线连接这些多维数据集。

这就是我将信息输入列表的方式:

private List<Cube> GetCubeList()
{
    XDocument xmlDoc = XDocument.Load (@"Cube_List.xml");
    var cubes = (from c in xmlDoc.Root.Elements("CUBE")
        select new Cube
        {
            Cubename = (string)c.Attribute("NAME"),
            }).ToList();
    return cubes.ToList();

}

  ...

  private List<IN> GetINLines()
{
    XDocument xmlDoc = XDocument.Load (@"Cube_List.xml");
    var inline = (from line in xmlDoc.Root.Elements("CUBE").Descendants("IN")
        select new InLine
        {
            Inline = (string)line.Attribute("NAME").Value,
        }).ToList();
    return inline().ToList();
}

3 个答案:

答案 0 :(得分:3)

创建一个Cube - 类作为傻瓜:

public class Cube
{
    [XmlAttribute("Name")]
    public string Name { get; set; }
    [XmlArrayItem("In")
    public List<Element> In { get; set; }
    [XmlArrayItem("Out")
    public List<Element> Out { get; set; }
}

public class Element
{
    [XmlAttribute("Name")]
    public string Name { get; set, }
}

最后,您需要周围的DEFTABLE - 课程:

[XmlRoot("DEFTABLE")]
public class DefTable
{
    [XmlArrayItem("Cube")]
    public List<Cube> Cubes { get; set; }
}

这应该很容易序列化/反序列化到/从Xml文件:

var ser = new XmlSerializer(typeof(DefTable));
var instance = (DefTable) ser.DeSerialize(myFile);

这种方式比依赖Linq2Xml容易得多,因为您可以直接使用之前创建的类结构。

有关序列化的更多信息和示例,请查看MSDN

编辑:要获得In的所有Cube行,现在非常简单:

var cube = instance.Cubes.Single(x => x.Name == "FristCube");
var inLines = cube.In;

答案 1 :(得分:0)

这是一种方法:

XmlDocument doc = new XmlDocument();
doc.Load(@"Cube_List.xml");
List<XmlNode> allInOutNodes = new List<XmlNode>();

var nodes = doc.SelectNodes("DEFTABLE/CUBE");
foreach (XmlNode node in nodes)
{
    allInOutNodes.AddRange(node.ChildNodes.OfType<XmlNode>());
}

答案 2 :(得分:0)

你需要一个两遍算法。第一遍创建立方体,边,并为侧面分配输入。第二次通过会向两侧增加输出。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication43
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            //pass one create cube and inputs
            foreach(XElement cube in  doc.Descendants("CUBE"))
            {
                Cube newCube = new Cube();
                Cube.cubes.Add(newCube);
                newCube.name = (string)cube.Attribute("NAME");
                newCube.sides = cube.Elements("IN").Select(y => new Side() {
                    name = (string)y.Attribute("NAME"),
                    _in = newCube
                }).ToList();
            }

            foreach (XElement xCube in doc.Descendants("CUBE"))
            {
                string outCubeName = (string)xCube.Attribute("NAME");
                Cube outCube = Cube.cubes.Where(x => x.name == outCubeName).FirstOrDefault();

                foreach(XElement _out in xCube.Elements("OUT"))
                {
                    string sideName = (string)_out.Attribute("NAME");
                    Boolean found = false;
                    foreach (Cube inCube in Cube.cubes)
                    {
                        foreach (Side side in inCube.sides)
                        {
                            if (side.name == sideName)
                            {
                                side._out = outCube;
                                found = true;
                                break;
                            }
                        }
                        if (found == true) break;
                    }
                }
            }



        }
    }
    public class Cube
    {
        public static List<Cube> cubes = new List<Cube>();

        public string name { get; set; }
        public List<Side> sides { get; set; }

    }
    public class Side
    {
        public string name { get; set; }
        public Cube _in { get; set; }
        public Cube _out { get; set; }
    }
}