使用Linq创建一个数组数组

时间:2010-12-14 16:32:30

标签: c# linq linq-to-xml

我有以下XML:

<datarow>
  <datacol><![CDATA[Value1]]></datacol>
  <datacol><![CDATA[Value2]]></datacol>
  <datacol><![CDATA[Value3]]></datacol>
</datarow>
<datarow>
  <datacol><![CDATA[Value5]]></datacol>
  <datacol><![CDATA[Value6]]></datacol>
  <datacol><![CDATA[Value7]]></datacol>
</datarow>
// ...

如何使用linq创建二维数组?

我会避免这样做:

foreach("datarow") {
    foreach ("datacol") { ... }
}

谢谢!

[编辑]最终数组应该是这样的:

array [,] = {{“Value1”,“Value2”,“Value3”},{“Value4”,“Value5”,“Value6”}}

3 个答案:

答案 0 :(得分:2)

以下是从XML数据创建锯齿状数组的示例。

var xmlStr = "<table><dataRow><dataCol>1</dataCol><dataCol>2</dataCol></dataRow><dataRow><dataCol>5</dataCol><dataCol>6</dataCol></dataRow></table>";
var rows = from r in XElement.Parse(xmlStr).Elements("dataRow") select r;

int[][] intJagArray = (from r in rows select (from c in r.Elements("dataCol") select Int32.Parse(c.Value)).ToArray()).ToArray();

这是帮助我解决这个问题的页面。 http://www.daniweb.com/code/snippet267931.html

答案 1 :(得分:1)

LINQ和多维数组混合不好。

您可以使用传统的foreach循环,但必须首先计算多维数组的大小:

string[,] result = new string
[
    doc.Elements("datarow").Count(),
    doc.Elements("datarow").Max(d => d.Elements("datacol").Count())
];

int x = 0;
foreach (var datarow in doc.Elements("datarow"))
{
    int y = 0;
    foreach (var datacol in datarow.Elements("datacol"))
    {
        result[x, y] = (string)datacol;
        y++;
    }
    x++;
}

但是创建一个锯齿状数组(即一维数组的一维数组; LINQ和一维数组混合得很好)真的要简单得多了!:

string[][] result = doc.Elements("datarow")
                       .Select(d => d.Elements("datacol")
                                     .Select(c => (string)c)
                                     .ToArray())
                       .ToArray();

答案 2 :(得分:0)

以下是创建Jagged Array的代码:

        XDocument doc = XDocument.Load("...");

        string[][] data = (from row in doc.Elements("datarow")
                           select row.Elements("datacol").Select(col => col.Value).ToArray()).ToArray();

我不确定如何使用Multi-Dimensional Array创建Linq