【问题标题】:Same Result when Outputting Data Using Double Foreach Loop使用双 Foreach 循环输出数据时结果相同
【发布时间】:2013-03-13 08:00:20
【问题描述】:

我需要将一个字符串设置成这样的

<Student>
    <StudentID></StudentID>
    <FirstName></FirstName>
    <Fees>
         <Fee>
             <FeeID></FeeID>
         </Fee>
    </Fees>
</Student>
<Student>
    <StudentID></StudentID>
    <FirstName></FirstName>
    <Fees>
         <Fee>
             <FeeID></FeeID>
         </Fee>
    </Fees>
</Student>
... and so on

我的代码

string strFeeData = ""; // XML Content for Fees
string strStuData = ""; // XML Content for Students with Fees

foreach (var studentData in sorted)
{
    foreach(Fee feeData in studentData.Fees)
    {
        strFeeData = strFeeData + "<Fee>\n\t<FeeID>" + feeData.FeeID + "</FeeID>\n\t<FeeName>" + feeData.FeeName + "</FeeName>\n\t<Amount>" + feeData.Amount + "</Amount>\n\t<DueDate>" + feeData.DueDate + "</DueDate>\n</Fee>\n";
    }
    strStuData = strStuData + "<Student>\n\t<StudentID>" + studentData.StudentID + "</StudentID>\n<FirstName>" + studentData.FirstName + "</FirstName>\n<LastName>" + studentData.LastName + "</LastName>\n<Grade>" + studentData.Grade + "</Grade>\n<Fees>\n\t" + strFeeData + "</Fees></Student>\n";
}

这部分输出正确

<Student>
    <StudentID>1</StudentID>
    <FirstName>David</FirstName>
...
<Student>
    <StudentID>2</StudentID>
    <FirstName>John</FirstName>

但要收费

<Fees>
     <Fee>
         <FeeID>12</FeeID>
....
<Fees>
     <Fee>
         <FeeID>12</FeeID>

我为每个学生收取相同的费用。

我的双 foreach 循环有什么问题?

(我已经检查过 sorted 的 Fee 有不同的值,问题肯定出在双 foreach 循环上)

谢谢

【问题讨论】:

  • 为什么要手动创建 XML?这是一种非常容易出错的方法。使用 .NET 中可用的众多 XML API 之一 - 最好是 LINQ to XML。
  • 我还是 C# 的初学者>
  • 这是我能想到的唯一解决方案

标签: c# loops foreach


【解决方案1】:

在外循环中用空字符串初始化strFeeData

foreach (var studentData in sorted)
{
    strFeeData = "";

    foreach(Fee feeData in studentData.Fees)
    {
        strFeeData = strFeeData + "<Fee>\n\t<FeeID>" + feeData.FeeID + "</FeeID>\n\t<FeeName>" + feeData.FeeName + "</FeeName>\n\t<Amount>" + feeData.Amount + "</Amount>\n\t<DueDate>" + feeData.DueDate + "</DueDate>\n</Fee>\n";
    }
    strStuData = strStuData + "<Student>\n\t<StudentID>" + studentData.StudentID + "</StudentID>\n<FirstName>" + studentData.FirstName + "</FirstName>\n<LastName>" + studentData.LastName + "</LastName>\n<Grade>" + studentData.Grade + "</Grade>\n<Fees>\n\t" + strFeeData + "</Fees></Student>\n";
}

但是,使用字符串连接创建 XML 真的很糟糕!您应该阅读有关 Serialization 或 LINQ to XML 的内容!

LINQ to XML 版本

var xml = sorted.Select(s => new XElement("Student"
                                 new XElement("StudentID", s.StudentID),
                                 new XElement("FirstName", s.FirstName),
                                 new XElement("LastName", s.LastName),
                                 new XElement("Fees",
                                    s.Fees.Select(f => new XElement("Fee",
                                                           new XElement("FeeID", f.FeeID))).ToArray())));

【讨论】:

  • 与 strFeeData = "";更糟糕的是:p 现在它只显示 1 名学生支付所有费用
  • 使用 LINQ to XML 版本,一旦我有了 var xml,我只需要 textwriter(xml); ?或者如何处理它?
  • 我 ToString();它并尝试控制台.writeline,它最终显示“System.Linq.Enumerable+WhereSelectEnumerableIterator2[&lt;&gt;f__AnonymousType06[System.Int32,System.String,System.String,System.String,System.Double,System.Linq。 IO rderedEnumerable`1[StudentList.RServiceReference.Fee]],System.Xml.Linq.XElement]"
  • 这里的主要问题是您的 XML 中根本没有根元素!您应该与所有学生 (var students = new XElement("Students", xml);) 创建类似 &lt;Students&gt; 的节点,然后调用 students.ToString()
【解决方案2】:

你为什么不这样尝试,你总是可以使用 XmlSerializer 将 C# 对象列表转换为 XML 文档。

public string ToXML()
    {
        var stringwriter = new System.IO.StringWriter();
        var serializer = new XmlSerializer(this.GetType());
        serializer.Serialize(stringwriter, this);
        return stringwriter.ToString();
    }

这将你的类转换为 xml 字符串

还要检查这个:Convert a C# object to XML?

Linq To XML 方式

XElement _customers = new XElement("Students",
                       from c in objCust
                       orderby c.CustID //descending 
                        select new XElement("Student",
                            new XElement("name", c.StudentID),
                            new XElement("ID", c.FirstName),
                            new XElement("phone", c.LastName),
                            new XElement("Fees", (from x in x.Fees
                                                  orderby x.FeeID//descending 
                            select new XElement("FeeID",x.FeesId)) 
                        ))

                  );

【讨论】:

  • @user1618180 - 在 google 上检查 C# 中的序列化,并检查你会明白的链接
猜你喜欢
  • 2011-02-23
  • 1970-01-01
  • 2012-09-23
  • 2017-04-29
  • 2011-12-03
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多