Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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/14.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#Linq to XML创建XML输出后,XML输出包含重复的值_C#_Xml_Linq To Xml - Fatal编程技术网

使用C#Linq to XML创建XML输出后,XML输出包含重复的值

使用C#Linq to XML创建XML输出后,XML输出包含重复的值,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,下面是我创建XML文件的代码 public void CreateXml(string[] names, string[] values, string type) { XElement xml = new XElement("Transaction", new XElement("TransactionType", type)); foreach (var i in names) { foreach

下面是我创建XML文件的代码

public void CreateXml(string[] names, string[] values, string type)
{
        XElement xml = new XElement("Transaction",
            new XElement("TransactionType", type));
        foreach (var i in names)
        {
            foreach (var o in values)
            {
                xml.Add(new XElement(i.Replace(" ", string.Empty), o));
            }
        }
        xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml");
}
我的输出是这样的

<?xml version="1.0" encoding="UTF-8"?>
<Transaction> 
    <TransactionType>Void</TransactionType> 
    <Zip>1</Zip>
     <Zip>2</Zip> 
     <PNRef>1</PNRef> 
     <PNRef>2</PNRef> 
 </Transaction>
<?xml version="1.0" encoding="UTF-8"?>
<Transaction> 
    <TransactionType>Void</TransactionType> 
    <Zip>1</Zip>
     <PNRef>2</PNRef> 
 </Transaction>

无效的
1.
2.
1.
2.
但这是不对的,我期待更多像这样的

<?xml version="1.0" encoding="UTF-8"?>
<Transaction> 
    <TransactionType>Void</TransactionType> 
    <Zip>1</Zip>
     <Zip>2</Zip> 
     <PNRef>1</PNRef> 
     <PNRef>2</PNRef> 
 </Transaction>
<?xml version="1.0" encoding="UTF-8"?>
<Transaction> 
    <TransactionType>Void</TransactionType> 
    <Zip>1</Zip>
     <PNRef>2</PNRef> 
 </Transaction>

无效的
1.
2.
正如我所注意到的,这些值是正确的,但如果我只是重复,我该如何解决这个问题

string[] textBoxNamesArray = flowLayoutPanelText.Controls.OfType<TextBox>()
                                  .Select(r => r.Name)
                                  .ToArray();

string[] textBoxTextsArray = flowLayoutPanelText.Controls.OfType<TextBox>()
                                  .Select(r => r.Text)
                                  .ToArray();
string[]textBoxNamesArray=flowLayoutPanelText.Controls.OfType()
.Select(r=>r.Name)
.ToArray();
string[]textBoxTextsArray=flowLayoutPanelText.Controls.OfType()的字符串
.选择(r=>r.Text)
.ToArray();

如果不知道如何在2个数组中构造数据,很难说,但我猜:

    for (int i = 0; i < names.Length; i++)
    {
        xml.Add(new XElement(names[i].Replace(" ", string.Empty), values[i]));
    }
for(int i=0;i
如果不知道如何在2个数组中构造数据,很难说,但我猜:

    for (int i = 0; i < names.Length; i++)
    {
        xml.Add(new XElement(names[i].Replace(" ", string.Empty), values[i]));
    }
for(int i=0;i
您不应该使用两个嵌套循环:两个嵌套循环创建笛卡尔乘积(即,每个名称都与每个值配对)

如果使用一个同时遍历名称和值的循环,您将获得预期的输出

如果您使用的是.NET 4,则可以使用
Zip
方法,如下所示:

xml.Add(
    names
    .Zip(values, (n,v) => new XElement(n.Name(" ", string.Empty), v))
    .ToArray()
);

因此,您不应该使用两个嵌套循环:两个嵌套循环创建笛卡尔乘积(即,每个名称都与每个值配对)

如果使用一个同时遍历名称和值的循环,您将获得预期的输出

如果您使用的是.NET 4,则可以使用
Zip
方法,如下所示:

xml.Add(
    names
    .Zip(values, (n,v) => new XElement(n.Name(" ", string.Empty), v))
    .ToArray()
);

用字典试试这个

public void CreateXml(Dictionary<string, string> myNameValuePairs, string type)
{
    XElement xml = new XElement("Transaction",
        new XElement("TransactionType", type));
    foreach (var key in names)
    {
        xml.Add(new XElement(key.Replace(" ", string.Empty), myNameValuePairs[key]));
     }
    xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml");
}
public void CreateXml(字典myNameValuePairs,字符串类型)
{
XElement xml=新XElement(“事务”,
新XElement(“TransactionType”,type));
foreach(变量输入名称)
{
Add(新的XElement(key.Replace(“,string.Empty),myNameValuePairs[key]);
}
Save(“C:\\Users\\PHWS13\\Desktop\\sample.xml”);
}
编辑:使用上述方法签名的变通方法。但是,只有当值[i]是名称[i]的对应值时,这才有效。除非您确定名称和值的数组长度和内容,否则我不会建议您这样做

public void CreateXml(string[] names, string[] values, string type)
{
    XElement xml = new XElement("Transaction",
        new XElement("TransactionType", type));
    foreach (var i = 0; i < names.length; i++)
    {
        xml.Add(new XElement(names[i].Replace(" ", string.Empty), values[i]));
    }
    xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml");
}
public void CreateXml(字符串[]名称、字符串[]值、字符串类型)
{
XElement xml=新XElement(“事务”,
新XElement(“TransactionType”,type));
foreach(var i=0;i
用字典试试这个

public void CreateXml(Dictionary<string, string> myNameValuePairs, string type)
{
    XElement xml = new XElement("Transaction",
        new XElement("TransactionType", type));
    foreach (var key in names)
    {
        xml.Add(new XElement(key.Replace(" ", string.Empty), myNameValuePairs[key]));
     }
    xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml");
}
public void CreateXml(字典myNameValuePairs,字符串类型)
{
XElement xml=新XElement(“事务”,
新XElement(“TransactionType”,type));
foreach(变量输入名称)
{
Add(新的XElement(key.Replace(“,string.Empty),myNameValuePairs[key]);
}
Save(“C:\\Users\\PHWS13\\Desktop\\sample.xml”);
}
编辑:使用上述方法签名的变通方法。但是,只有当值[i]是名称[i]的对应值时,这才有效。除非您确定名称和值的数组长度和内容,否则我不会建议您这样做

public void CreateXml(string[] names, string[] values, string type)
{
    XElement xml = new XElement("Transaction",
        new XElement("TransactionType", type));
    foreach (var i = 0; i < names.length; i++)
    {
        xml.Add(new XElement(names[i].Replace(" ", string.Empty), values[i]));
    }
    xml.Save("C:\\Users\\PHWS13\\Desktop\\sample.xml");
}
public void CreateXml(字符串[]名称、字符串[]值、字符串类型)
{
XElement xml=新XElement(“事务”,
新XElement(“TransactionType”,type));
foreach(var i=0;i
您的问题就在这里。foreach(名称中的vari){foreach(值中的varo){您可能希望将它们作为字典类型的对象或对象集合发送。然后在字典或集合上进行单个循环。@ryadavilli,有什么方法可以做到吗?谢谢!dasblinkenlight在下面给出了很好的解释和解决方法。我在下面的回答中简单解释了如何使用字典。您的问题是什么m位于这里。foreach(名称中的vari){foreach(值中的varo){您可能希望将它们作为字典类型的对象或对象集合发送。然后在字典或集合上做一个循环。@ryadavilli,有什么方法可以做到吗?谢谢!dasblinkenlight在下面给出了很好的解释和解决方法。我在下面的回答中简单解释了如何使用字典。当然可以这两个数组总是有相同的长度:)是的,但问题是这并不明显,只有你知道;-)。最好只有一个对象集合,每个对象都有两个属性。@GrayFullBuster如果你确定数组的长度和值,我在回答中给出了一个变通方法。但这仍然是个问题这不是一种很好的处理方法。两个数组的确定点是它们的长度总是相同的:)是的,但问题是这并不明显,只有你知道;-)。最好只有一个对象集合,每个对象都有两个属性。@GrayFullBuster如果你确定的话,我在回答中给出了一个变通方法ur数组长度和值。但这仍然不是一个很好的方法。n,v这些是数组?@GrayFullBuster否,这些是lambda的参数-
Zip
方法的第二个参数。它描述了如何将名称和值配对到单个临时对象中,用于下一步构造
XElement
.EDIT顺便说一句,我把表达式简化了一些,以便删除