C# 正确地读取xml,但以后会弄乱顺序
我将xml数据从文件解析为此类对象的列表:C# 正确地读取xml,但以后会弄乱顺序,c#,xml,C#,Xml,我将xml数据从文件解析为此类对象的列表: public class VerificationSample { public double DesiredA { get; set; } public double DesiredB { get; set; } public double DesiredC { get; set; } // .. public void ReadXml(XmlReader reader) { rea
public class VerificationSample
{
public double DesiredA { get; set; }
public double DesiredB { get; set; }
public double DesiredC { get; set; }
// ..
public void ReadXml(XmlReader reader)
{
reader.ReadToFollowing("VerificationSample");
this.DesiredA = (double)FileStructure.GetAttributeSafe(reader, "DesiredA", typeof(double));
this.DesiredB = (double)FileStructure.GetAttributeSafe(reader, "DesiredB", typeof(double));
this.DesiredC = (double)FileStructure.GetAttributeSafe(reader, "DesiredC", typeof(double));
this.ReferenceNumber = (int)FileStructure.GetAttributeSafe(reader, "ReferenceNumber", typeof(int));
// ..
}
}
我阅读了以下示例xml:
<VerificationSamples Count="4">
<VerificationSample DesiredA="0.000" DesiredB="50.000" DesiredC="0.000" ReferenceNumber="0"/>
<VerificationSample DesiredA="75.000" DesiredB="-3.000" DesiredC="0.000" ReferenceNumber="0"/>
<VerificationSample DesiredA="-30.000" DesiredB="0.000" DesiredC="0.000" ReferenceNumber="1"/>
<VerificationSample DesiredA="-2.000" DesiredB="-60.000" DesiredC="0.200" ReferenceNumber="1"/>
</VerificationSamples>
使用此例程:
public void LoadFromFile(string path)
{
XmlReader reader = XmlReader.Create(path);
// ..
reader.ReadToFollowing("VerificationSamples");
int count = (int)FileStructure.GetAttributeSafe(reader, "Count", typeof(int));
this.VerificationSamples.Clear();
for (int i = 0; i < count; i++)
{
VerificationSample newVerificationSample = new VerificationSample();
newVerificationSample.ReadXml(reader);
this.VerificationSamples.Add(newVerificationSample);
}
}
public void LoadFromFile(字符串路径)
{
XmlReader=XmlReader.Create(路径);
// ..
读者。阅读以下内容(“验证样本”);
int count=(int)FileStructure.GetAttributeSafe(reader,“count”,typeof(int));
此.VerificationSamples.Clear();
for(int i=0;i
到目前为止,一切都很好,效果很好。但是,稍后当我执行另一个函数,试图访问我的
验证样本
列表以使用我的对象的一些值时,对象的顺序会变得混乱。。所以xml中的第一行(是第一个对象),但后来是第三行。。二是一。。第四是第二,依此类推(无明显模式)。有人能想象为什么吗?如果文件不大,请使用XElement
using System.Xml.Linq
XElement file=XElement.Load(@"your path");
foreach(var VerificationSample in file.Elements("VerificationSample"))
{
// do want you want XElement type VerificationSample in order at the file
}
如果文件不大,请使用XElement
using System.Xml.Linq
XElement file=XElement.Load(@"your path");
foreach(var VerificationSample in file.Elements("VerificationSample"))
{
// do want you want XElement type VerificationSample in order at the file
}
根据,List
保证插入顺序和检索顺序
如果项目没有按照添加顺序出现,则会有一些外力干扰顺序(可能是排序)。Per,List
保证插入顺序和检索顺序
如果项目没有按照添加顺序出现,则会有一些外力干扰顺序(可能是排序)。这是由于从数据库检索数据时出现问题造成的。通过在xml
OrderID
中添加一个属性,该属性将用作订单的引用,目前已修复:
<VerificationSamples Count="4">
<VerificationSample DesiredA="0.000" DesiredB="50.000" DesiredC="0.000" ReferenceNumber="0" OrderID="1"/>
<VerificationSample DesiredA="75.000" DesiredB="-3.000" DesiredC="0.000" ReferenceNumber="0" OrderID="2"/>
<VerificationSample DesiredA="-30.000" DesiredB="0.000" DesiredC="0.000" ReferenceNumber="1" OrderID="3"/>
<VerificationSample DesiredA="-2.000" DesiredB="-60.000" DesiredC="0.200" ReferenceNumber="1" OrderID="4"/>
</VerificationSamples>
每当我从数据库中检索列表时,我都会按照OrderID对其进行排序<代码>验证样本.OrderBy(x=>x.OrderID)代码>发生这种情况是因为从数据库检索数据时出现问题。通过在xml
OrderID
中添加一个属性,该属性将用作订单的引用,目前已修复:
<VerificationSamples Count="4">
<VerificationSample DesiredA="0.000" DesiredB="50.000" DesiredC="0.000" ReferenceNumber="0" OrderID="1"/>
<VerificationSample DesiredA="75.000" DesiredB="-3.000" DesiredC="0.000" ReferenceNumber="0" OrderID="2"/>
<VerificationSample DesiredA="-30.000" DesiredB="0.000" DesiredC="0.000" ReferenceNumber="1" OrderID="3"/>
<VerificationSample DesiredA="-2.000" DesiredB="-60.000" DesiredC="0.200" ReferenceNumber="1" OrderID="4"/>
</VerificationSamples>
每当我从数据库中检索列表时,我都会按照OrderID对其进行排序<代码>验证样本.OrderBy(x=>x.OrderID)这是因为它只是从列表中任意获取对象-您需要使用
.OrderBy(x=>x.SomeValue)
以特定的方式返回它们order@Geoff它从不随机抓取xml行。它总是从第一行->添加对象,第二行->添加对象开始。。等等,我看了很多遍。如果是这样的话,您会为您的论点提出什么解决方案?您是对的-它将按顺序抓取XML行-但是当您从内存中再次迭代/抓取列表时,内存中的“列表”(VerificationSamples
?)将需要对值进行排序;否则,对于您@FirstStep,顺序将看起来是“随机的”Q-您是否希望以任何特定顺序输出VerificationSamples
?或者你只是在问为什么它们被任意输出?@FirstStep认为你的方法是正确的。我会在数据库中创建一个Order
列,并使其成为一个自动递增键(或类似键)。或者,您可以在从Xml创建集合时执行此操作(仅在读取项时设置对象的属性)。然后,您可以在迭代收集时使用.OrderBy(x=>x.Order)
这是因为它只是从列表中任意获取对象-您需要使用.OrderBy(x=>x.SomeValue)
以特定的方式返回它们order@Geoff它从不随机抓取xml行。它总是从第一行->添加对象,第二行->添加对象开始。。等等,我看了很多遍。如果是这样的话,您会为您的论点提出什么解决方案?您是对的-它将按顺序抓取XML行-但是当您从内存中再次迭代/抓取列表时,内存中的“列表”(VerificationSamples
?)将需要对值进行排序;否则,对于您@FirstStep,顺序将看起来是“随机的”Q-您是否希望以任何特定顺序输出VerificationSamples
?或者你只是在问为什么它们被任意输出?@FirstStep认为你的方法是正确的。我会在数据库中创建一个Order
列,并使其成为一个自动递增键(或类似键)。或者,您可以在从Xml创建集合时执行此操作(仅在读取项时设置对象的属性)。然后你可以在迭代你的收藏时.OrderBy(x=>x.Order)
,谢谢Mehmet的建议。但是XmlReader在代码中无处不在,更改它现在是一个耗时的过程,谢谢Mehmet的建议。但是XmlReader在代码中无处不在,改变它现在是一个非常耗时的过程,Mike我花了很多时间调试这个案例。我在某处寻找排序/排序依据函数,但找不到任何函数。我认为数据库正在以任意方式检索数据(bug)。通过在xml中硬编码OrderID并将其保留为我的OrderReferenceMike我花时间调试这个案例,现在修复了这个问题。我在某处寻找排序/排序依据函数,但找不到任何函数。我认为数据库正在以任意方式检索数据(bug)。通过在xml中硬编码OrderID并将其作为我的OrderReference,修复了目前的情况