2010-12-14 8 views
1

J'ai le code XML suivant:Créer un tableau de tableaux avec Linq

<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> 
// ... 

Comment puis-je créer un tableau à deux dimensions en utilisant LINQ?

Je vais éviter de faire:

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

Merci!

[EDIT] tableau final devrait ressembler à ceci:

tableau

[,] = {{ "Valeur1", "Valeur2", "Value3"}, { "Value4", "valeur5", "valeur6" }}

+0

Il est LINQ, pas de lien ;-) Il est bien dans le titre, mais il y a une faute de frappe dans le corps!. –

+0

Voulez-vous dire un tableau dentelé ou un tableau multidimensionnel? – SLaks

+0

S'il vous plaît voir mon édition –

Répondre

2

Voici un exemple pour créer un tableau en dents de scie à partir de données 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(); 

Voici la page qui m'a aidé à comprendre cela. http://www.daniweb.com/code/snippet267931.html

0

Voici le code pour créer Jagged Array:

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

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

Je ne sais pas comment vous pouvez créer un Multi-Dimensional Array en utilisant Linq.

+0

'string [] []' est un tableau en dents de scie, pas un tableau multidimensionnel ('string [,]'). – dtb

+0

Ouais, j'ai réalisé ça. Corrigée. – decyclone

1

Les matrices LINQ et multidimensionnelles ne se mélangent pas bien.

Vous pouvez utiliser une boucle foreach traditionnelle, mais vous devez calculer la taille du tableau à plusieurs dimensions d'abord:

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++; 
} 

Mais il est vraiment beaucoup plus simple de créer un tableau en dents de scie (par exemple une dimension tableau de tableaux unidimensionnels, LINQ et tableaux unidimensionnels bien mélanger):

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