使用Double Foreach循环输出数据时的相同结果

时间:2013-03-13 08:00:20

标签: c# loops foreach

我需要将字符串设置为类似

的字符串
<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循环有什么问题?

(我已经检查过sort's Fee有不同的值,问题必须是双foreach循环)

由于

2 个答案:

答案 0 :(得分:2)

在外部循环中使用空字符串初始化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真是个坏主意!您应该阅读有关序列化或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())));

答案 1 :(得分: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)) 
                        ))

                  );