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