Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何连接两个列表_C#_Xml_Linq_List_Parsing - Fatal编程技术网

C# 如何连接两个列表

C# 如何连接两个列表,c#,xml,linq,list,parsing,C#,Xml,Linq,List,Parsing,我不确定这是不是一件简单的事情 我有一个XML文件的结构如下: 现在我已经创建了一个包含所有多维数据集名称的列表,一个包含所有内联线的列表和一个包含所有轮廓的列表。 正如您所见,一个立方体可以有多个内线和轮廓-如何将它们匹配在一起? 我想我需要一个包含所有内部和轮廓的类“立方体”,但我不知道如何实现这一点。 我想创建立方体列表(Unity)的3D对象,并用合适的线连接这些立方体 以下是我将信息输入列表的方式: private List GetCubeList() { XDocument xm

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

我有一个XML文件的结构如下:


现在我已经创建了一个包含所有多维数据集名称的列表,一个包含所有内联线的列表和一个包含所有轮廓的列表。 正如您所见,一个立方体可以有多个内线和轮廓-如何将它们匹配在一起?

我想我需要一个包含所有内部和轮廓的类“立方体”,但我不知道如何实现这一点。

我想创建立方体列表(Unity)的3D对象,并用合适的线连接这些立方体

以下是我将信息输入列表的方式:

private List GetCubeList()
{
XDocument xmlDoc=XDocument.Load(@“Cube_List.xml”);
var cubes=(来自xmlDoc.Root.Elements(“多维数据集”)中的c)
选择新建多维数据集
{
Cubename=(字符串)c.Attribute(“名称”),
}).ToList();
返回cubes.ToList();
}
...
私有列表GetINLines()
{
XDocument xmlDoc=XDocument.Load(@“Cube_List.xml”);
var inline=(来自xmlDoc.Root.Elements(“多维数据集”)子体(“in”)中的行)
选择“新建内联”
{
Inline=(字符串)line.Attribute(“NAME”).Value,
}).ToList();
返回inline().ToList();
}

创建一个
多维数据集
-类作为傻瓜:

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, }
}
这应该很容易对Xml文件进行序列化/反序列化:

var ser = new XmlSerializer(typeof(DefTable));
var instance = (DefTable) ser.DeSerialize(myFile);
这种方法比依赖Linq2Xml容易得多,因为您可以直接使用以前创建的类结构

有关序列化的更多信息和示例,请参阅

编辑:从
多维数据集中获取
中的所有
行现在非常容易:

var cube = instance.Cubes.Single(x => x.Name == "FristCube");
var inLines = cube.In;
这里有一种方法:

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>());
}
XmlDocument doc=新的XmlDocument();
doc.Load(@“Cube_List.xml”);
List ALINOUTNODES=新列表();
变量节点=doc.SelectNodes(“可定义/多维数据集”);
foreach(节点中的XmlNode节点)
{
AddRange(node.ChildNodes.OfType());
}

您需要一个两遍算法。第一步创建立方体、边,并将输入指定给边。第二遍将输出添加到边

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; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
命名空间控制台应用程序43
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
XDocument doc=XDocument.Load(文件名);
//传递一个创建多维数据集和输入
foreach(文档子体(“多维数据集”)中的XElement多维数据集)
{
多维数据集newCube=新多维数据集();
Cube.cubes.Add(newCube);
newCube.name=(字符串)cube.Attribute(“名称”);
newCube.sides=cube.Elements(“IN”)。选择(y=>newside(){
名称=(字符串)y.Attribute(“名称”),
_in=newCube
}).ToList();
}
foreach(文档子体(“多维数据集”)中的XElement xCube)
{
字符串outCubeName=(字符串)xCube.Attribute(“名称”);
Cube outCube=Cube.cubes.Where(x=>x.name==outCubeName.FirstOrDefault();
foreach(xCube.Elements中的XElement_out(“out”))
{
string sideName=(string)_out.Attribute(“NAME”);
布尔值=false;
foreach(多维数据集在Cube.cubes中)
{
foreach(砧骨中的侧边)
{
if(side.name==sideName)
{
侧面。_out=outCube;
发现=真;
打破
}
}
如果(发现==真)中断;
}
}
}
}
}
公共类多维数据集
{
公共静态列表多维数据集=新列表();
公共字符串名称{get;set;}
公共列表边{get;set;}
}
公营部门
{
公共字符串名称{get;set;}
{get;set;}中的公共多维数据集
公共多维数据集_out{get;set;}
}
}

这应该行得通,但我认为一个带有“[XMLROOT]”属性和多维数据集的可定义类会更好。我已经等了3分钟,等待您添加缺少的部分,然后添加了我的注释:)现在大小写可能是个问题,但我同意您的意见;此解决方案比Linq2XmlHeya更好,谢谢您的解决方案!我对你最后的“编辑”部分有问题。“var cube=defTableInstance.Cubes.Single(“FristCube”);”,defTableInstance不存在,我不知道在那里插入什么。Greetings@V.Daymir我更新了答案,当然我更新了反序列化实例。@HimBromBeere啊,太酷了,谢谢!现在,我在使用“Single”编译时出错:System.Collections.Generic.List没有“Single”的任何定义,并且存在无效的参数。另一种方法是创建一个
Line
类和一个class
Cube
。类
Line
有两个
Cube
元素,InCube和OutCube。那么您只需要一个
列表
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; }
    }
}