Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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#foreach循环外部字符串未正常更新_C#_Xml_Foreach - Fatal编程技术网

C#foreach循环外部字符串未正常更新

C#foreach循环外部字符串未正常更新,c#,xml,foreach,C#,Xml,Foreach,我知道这是最好用适当的类来编写Xml文档,但我的时间很短,需要一个快速的结果 我尝试将xml文件写入字符串,然后将其另存为xml文件。 结果不正确,因为字符串每次只获取foreach循环的最后一个值 我搜索了这个问题,发现我需要在foreach循环中启动字符串,但我不理解这个概念,也不知道具体在哪里 我应该在代码中修改什么 string siteMap = "<? xml version = \"1.0\" encoding = \"UTF-8\" ?>"; List<str

我知道这是最好用适当的类来编写Xml文档,但我的时间很短,需要一个快速的结果

我尝试将xml文件写入字符串,然后将其另存为xml文件。 结果不正确,因为字符串每次只获取foreach循环的最后一个值

我搜索了这个问题,发现我需要在foreach循环中启动字符串,但我不理解这个概念,也不知道具体在哪里

我应该在代码中修改什么

string siteMap = "<? xml version = \"1.0\" encoding = \"UTF-8\" ?>";

List<string> Niveau1Titles = getNiveau1Titles(aux1);
List<List<Couple>> Niveau2Titles = getNiveau2Titles(aux1);

int i = 0;
foreach (var n2 in Niveau2Titles)
{
    siteMap += "<Niveau_1 Title = \"" + Niveau1Titles[i] + "\" >";
    foreach (var n22 in n2)
    {
        siteMap += "<Niveau_2 Title = \"" + n22.Title + "\" Link = \"" + n22.Link + "\" >";
        List<Couple> Niveau3Titles = new List<Couple>();
        Niveau3Titles = getNiveau3Titles(n22.Link);
        foreach(var n3 in Niveau3Titles)
        {
            siteMap += "<Niveau_3 Title = \"" + n3.Title + "\" Link = \"" + n3.Link + "\" />";
        }
        siteMap += "</Niveau_2>";

    }
    siteMap += "</Niveau_1>";
    i++;
}


Console.WriteLine(siteMap);
string siteMap=”“;
List Niveau1Titles=getNiveau1Titles(aux1);
List Niveau2Titles=getNiveau2Titles(aux1);
int i=0;
foreach(NIVEAU2标题中的变量n2)
{
网站地图+=“”;
foreach(n2中的变量n22)
{
网站地图+=“”;
List Niveau3Titles=新列表();
Niveau3Titles=getNiveau3Titles(n22.Link);
foreach(Niveau3Titles中的风险值n3)
{
网站地图+=“”;
}
网站地图+=“”;
}
网站地图+=“”;
i++;
}
Console.WriteLine(站点地图);

我认为代码工作正常。xml中有多个根元素。您需要添加一个根。此外,xml标识行中还有一个额外的空间。请尝试下面的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string aux1 = "";
            //remove extra space
            string siteMap = "<?xml version = \"1.0\" encoding = \"UTF-8\" ?>";
            siteMap += "<Root>";

            List<string> Niveau1Titles = getNiveau1Titles(aux1);
            List<List<Couple>> Niveau2Titles = getNiveau2Titles(aux1);

            int i = 0;
            foreach (var n2 in Niveau2Titles)
            {
                siteMap += "<Niveau_1 Title = \"" + Niveau1Titles[i] + "\" >";
                foreach (var n22 in n2)
                {
                    siteMap += "<Niveau_2 Title = \"" + n22.Title + "\" Link = \"" + n22.Link + "\" >";
                    List<Couple> Niveau3Titles = new List<Couple>();
                    Niveau3Titles = getNiveau3Titles(n22.Link);
                    foreach (var n3 in Niveau3Titles)
                    {
                        siteMap += "<Niveau_3 Title = \"" + n3.Title + "\" Link = \"" + n3.Link + "\" />";
                    }
                    siteMap += "</Niveau_2>";

                }
                siteMap += "</Niveau_1>";
                i++;
            }
            siteMap += "</Root>";


            Console.WriteLine(siteMap);
            Console.ReadLine();
        }
        static List<string> getNiveau1Titles(string aux1)
        {
            return new List<string> { "aaa", "aab", "aac", "aad" };
        }
        static List<List<Couple>> getNiveau2Titles(string aux1)
        {
            return new List<List<Couple>>() { 
                  new List<Couple>() {new Couple() { Title = "T11", Link =  "L11"}, new Couple() { Title = "T12", Link =  "L12"}, new Couple() { Title = "T13", Link =  "L13"} },
                  new List<Couple>() {new Couple() { Title = "T21", Link =  "L21"}, new Couple() { Title = "T22", Link =  "L22"}, new Couple() { Title = "T23", Link =  "L23"} },
                  new List<Couple>() {new Couple() { Title = "T31", Link =  "L31"}, new Couple() { Title = "T32", Link =  "L32"}, new Couple() { Title = "T33", Link =  "L33"} },
                  new List<Couple>() {new Couple() { Title = "T41", Link =  "L41"}, new Couple() { Title = "T42", Link =  "L42"}, new Couple() { Title = "T43", Link =  "L43"} }
            };
        }
        static List<Couple> getNiveau3Titles(string aux1)
        {
            return new List<Couple>() { new Couple() { Title = "T100", Link = "L100" }, new Couple() { Title = "T101", Link = "L101" }, new Couple() { Title = "T102", Link = "L102" } };
        }

    }
    public class Couple
    {
        public string Title { get; set; }
        public string Link { get; set; }
    }

}
​
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串aux1=“”;
//删除多余的空间
字符串siteMap=“”;
网站地图+=“”;
List Niveau1Titles=getNiveau1Titles(aux1);
List Niveau2Titles=getNiveau2Titles(aux1);
int i=0;
foreach(NIVEAU2标题中的变量n2)
{
网站地图+=“”;
foreach(n2中的变量n22)
{
网站地图+=“”;
List Niveau3Titles=新列表();
Niveau3Titles=getNiveau3Titles(n22.Link);
foreach(Niveau3Titles中的风险值n3)
{
网站地图+=“”;
}
网站地图+=“”;
}
网站地图+=“”;
i++;
}
网站地图+=“”;
Console.WriteLine(站点地图);
Console.ReadLine();
}
静态列表getNiveau1Titles(字符串aux1)
{
返回新列表{“aaa”、“aab”、“aac”、“aad”};
}
静态列表getNiveau2Titles(字符串aux1)
{
返回新列表(){
新列表(){new Couple(){Title=“T11”,Link=“L11”},new Couple(){Title=“T12”,Link=“L12”},new Couple(){Title=“T13”,Link=“L13”},
新列表(){new Couple(){Title=“T21”,Link=“L21”},new Couple(){Title=“T22”,Link=“L22”},new Couple(){Title=“T23”,Link=“L23”},
新列表(){new Couple(){Title=“T31”,Link=“L31”},new Couple(){Title=“T32”,Link=“L32”},new Couple(){Title=“T33”,Link=“L33”},
新列表(){new Couple(){Title=“T41”,Link=“L41”},new Couple(){Title=“T42”,Link=“L42”},new Couple(){Title=“T43”,Link=“L43”}
};
}
静态列表getNiveau3Titles(字符串aux1)
{
返回new List(){new Couple(){Title=“T100”,Link=“L100”},new Couple(){Title=“T101”,Link=“L101”},new Couple(){Title=“T102”,Link=“L102”};
}
}
公务舱夫妇
{
公共字符串标题{get;set;}
公共字符串链接{get;set;}
}
}
​
下面是xml结果

<?xml version = "1.0" encoding = "UTF-8" ?>
<Root>
  <Niveau_1 Title = "aaa" >
    <Niveau_2 Title = "T11" Link = "L11" >
      <Niveau_3 Title = "T100" Link = "L100" />
      <Niveau_3 Title = "T101" Link = "L101" />
      <Niveau_3 Title = "T102" Link = "L102" />
    </Niveau_2>
    <Niveau_2 Title = "T12" Link = "L12" >
      <Niveau_3 Title = "T100" Link = "L100" />
      <Niveau_3 Title = "T101" Link = "L101" />
      <Niveau_3 Title = "T102" Link = "L102" />
    </Niveau_2>
    <Niveau_2 Title = "T13" Link = "L13" >
      <Niveau_3 Title = "T100" Link = "L100" />
      <Niveau_3 Title = "T101" Link = "L101" />
      <Niveau_3 Title = "T102" Link = "L102" />
    </Niveau_2>
  </Niveau_1>
  <Niveau_1 Title = "aab" >
    <Niveau_2 Title = "T21" Link = "L21" >
      <Niveau_3 Title = "T100" Link = "L100" />
      <Niveau_3 Title = "T101" Link = "L101" />
      <Niveau_3 Title = "T102" Link = "L102" />
    </Niveau_2>
    <Niveau_2 Title = "T22" Link = "L22" >
      <Niveau_3 Title = "T100" Link = "L100" />
      <Niveau_3 Title = "T101" Link = "L101" />
      <Niveau_3 Title = "T102" Link = "L102" />
    </Niveau_2>
    <Niveau_2 Title = "T23" Link = "L23" >
      <Niveau_3 Title = "T100" Link = "L100" />
      <Niveau_3 Title = "T101" Link = "L101" />
      <Niveau_3 Title = "T102" Link = "L102" />
    </Niveau_2>
  </Niveau_1>
  <Niveau_1 Title = "aac" >
    <Niveau_2 Title = "T31" Link = "L31" >
      <Niveau_3 Title = "T100" Link = "L100" />
      <Niveau_3 Title = "T101" Link = "L101" />
      <Niveau_3 Title = "T102" Link = "L102" />
    </Niveau_2>
    <Niveau_2 Title = "T32" Link = "L32" >
      <Niveau_3 Title = "T100" Link = "L100" />
      <Niveau_3 Title = "T101" Link = "L101" />
      <Niveau_3 Title = "T102" Link = "L102" />
    </Niveau_2>
    <Niveau_2 Title = "T33" Link = "L33" >
      <Niveau_3 Title = "T100" Link = "L100" />
      <Niveau_3 Title = "T101" Link = "L101" />
      <Niveau_3 Title = "T102" Link = "L102" />
    </Niveau_2>
  </Niveau_1>
  <Niveau_1 Title = "aad" >
    <Niveau_2 Title = "T41" Link = "L41" >
      <Niveau_3 Title = "T100" Link = "L100" />
      <Niveau_3 Title = "T101" Link = "L101" />
      <Niveau_3 Title = "T102" Link = "L102" />
    </Niveau_2>
    <Niveau_2 Title = "T42" Link = "L42" >
      <Niveau_3 Title = "T100" Link = "L100" />
      <Niveau_3 Title = "T101" Link = "L101" />
      <Niveau_3 Title = "T102" Link = "L102" />
    </Niveau_2>
    <Niveau_2 Title = "T43" Link = "L43" >
      <Niveau_3 Title = "T100" Link = "L100" />
      <Niveau_3 Title = "T101" Link = "L101" />
      <Niveau_3 Title = "T102" Link = "L102" />
    </Niveau_2>
  </Niveau_1>
</Root>​

花费5分钟来确保这是使用LINQ to XML生成的似乎并不太难:

var result =
    new XDocument(
        new XDeclaration("1.0", "UTF-8", "yes"),
        new XElement(
            "sitemap",
            Niveau2Titles.Zip(Niveau1Titles, (n2, n1) =>
                new XElement(
                    "Niveau_1",
                    new XAttribute("Title", n1),
                    n2.Select(n22 =>
                        new XElement(
                            "Niveau_2",
                            new XAttribute("Title", n22.Title),
                            new XAttribute("Link", n22.Link),
                            getNiveau3Titles(n22.Link).Select(n3 =>
                                new XElement(
                                    "Niveau_3",
                                    new XAttribute("Title", n3.Title),
                                    new XAttribute("Link", n3.Link)))))))));

在C#中使用lambda表达式或匿名方法时,我们必须小心访问修改的闭包陷阱。例如:

foreach (var s in strings)
{
   query = query.Where(i => i.Prop == s); // access to modified closure
   ...
}
由于修改了闭包,上述代码将导致查询中的所有
Where
子句基于
s
的最终值

如上所述,之所以会发生这种情况,是因为在上面的
foreach
循环中声明的
s
变量在编译器中的转换方式如下:

string s;
while (enumerator.MoveNext())
{
   s = enumerator.Current;
   ...
}
而不是像这样:

while (enumerator.MoveNext())
{
   string s;
   s = enumerator.Current;
   ...
}
如前所述,在循环外部声明变量没有性能优势,在正常情况下,我能想到的唯一原因是如果您计划在循环范围之外使用变量:

string s;
while (enumerator.MoveNext())
{
   s = enumerator.Current;
   ...
}
var finalString = s;
foreach(string s in strings)
{
}
var finalString = s; // won't work: you're outside the scope.
但是,
foreach
循环中定义的变量不能在循环外使用:

string s;
while (enumerator.MoveNext())
{
   s = enumerator.Current;
   ...
}
var finalString = s;
foreach(string s in strings)
{
}
var finalString = s; // won't work: you're outside the scope.

因此,编译器声明变量的方式使其极易发生错误,这通常很难找到和调试,同时也不会产生任何明显的好处。

结果不正确,因为每次代码中有3个
foreach
时,字符串仅获取foreach循环的最后一个值,哪一个导致了问题?乍一看,代码没有任何问题。它应该像预期的那样工作。你能给我们举一个给你带来意想不到结果的例子吗?另外,您是否验证了getNiveauXTitles函数是否都提供了正确的数据?我没有看到,您的代码在哪里创建了单个根元素。另外,我真的不明白,不使用适当的XML API如何能节省时间。内部的API(第三个foreach)造成了问题。当我使用Console.WriteLine()时,结果是正确的。@DeepBlue,更新您当前的