2009-12-11 2 views
8

J'ai une bibliothèque externe qui nécessite un "XmlNode []" au lieu de XmlNodeList. Existe-t-il un moyen direct de faire cela sans itération et transfert de chaque noeud?Convertir XmlNodeList en XmlNode []

Je ne veux pas le faire:

XmlNode[] exportNodes = XmlNode[myNodeList.Count]; 
int i = 0; 
foreach(XmlNode someNode in myNodeList) { exportNodes[i++] = someNode; } 

Je fais cela dans .NET 2.0, donc je besoin d'une solution sans LINQ.

+1

existe-t-il une raison de ne pas parcourir le 'XmlNodeList' et de l'utiliser pour charger le' XmlNode [] '? Parce que si tu avais fait ça, tu aurais fini maintenant. –

+0

Aucune raison, c'est l'implémentation actuelle. Il semble juste étrange pour moi que cela ne puisse pas être fait avec plus de sémantique du compilateur. – GrayWizardx

+2

La sémantique du compilateur pour cela est dans les versions plus récentes de C# /. NET :) Si vous êtes coincé avec une version plus ancienne, alors vous êtes coincé avec ce que vous avez. – Zooba

Répondre

7

Essayez ceci (VS2008 et cadre cible == 2.0):

static void Main(string[] args) 
{ 
    XmlDocument xmldoc = new XmlDocument(); 
    xmldoc.LoadXml("<a><b /><b /><b /></a>"); 
    XmlNodeList xmlNodeList = xmldoc.SelectNodes("//b"); 
    XmlNode[] array = (
     new System.Collections.Generic.List<XmlNode>(
      Shim<XmlNode>(xmlNodeList))).ToArray(); 
} 

public static IEnumerable<T> Shim<T>(System.Collections.IEnumerable enumerable) 
{ 
    foreach (object current in enumerable) 
    { 
     yield return (T)current; 
    } 
} 

Conseils d'ici: IEnumerable and IEnumerable(Of T) 2

+0

@CaTx OP a demandé une solution sans Linq, et d'autres réponses l'utilisent. La méthode 'Shim' est proposée en tant que méthode d'extension, elle peut donc être réutilisée et placée dans une autre classe avec d'autres méthodes d'extensions. Si vous avez des exigences différentes, vous devriez poser une nouvelle question. –

18

Que diriez-vous de cette façon straightfoward ...

var list = new List<XmlNode>(xml.DocumentElement.GetElementsByTagName("nodeName").OfType<XmlNode>()); 
var itemArray = list.ToArray(); 

Pas besoin de méthodes d'extension etc ...

+7

'OfType' est une extension LINQ. – vcsjones

7
XmlNode[] nodeArray = myXmlNodeList.Cast<XmlNode>().ToArray(); 
Questions connexes