Am vrut să văd care dintre aceste soluții sugerate a fost cea mai bună, așa că am făcut niște teste comparative. Din interes, am comparat, de asemenea, metodele LINQ cu metoda System.Xml veche, sugerată de Greg. Variația a fost interesantă și nu cea pe care am așteptat-o, cele mai lente metode fiind mai mult de 3 ori mai lent decât cele mai rapide .
Rezultatele comandate de cel mai rapid la cel mai lent:
- CreateReader - Hunter de instanță (0.113 secunde)
- Sistemul vechi System.Xml - Greg Hurlman (0.134 secunde)
- Agregat cu concatenare în șir - Mike Powell (0.324 secunde)
- StringBuilder - Vin (0.333 secunde)
- String.Join pe matrice - Terry (0.360 secunde)
- String.Concat pe matrice - Marcin Kosieradzki (0.364)
Metoda
Am folosit un singur document xml cu 20 de noduri identice (numit "hint"):
Thinking of using a fake address?
Please don't. If we can't verify your address we might just
have to reject your application.
Numerele afișate ca secunde de mai sus sunt rezultatul extragerii "interiorului XML" al celor 20 de noduri, de 1000 de ori la rând, și luarea mediei (mediei) a 5 runde. Nu am inclus timpul necesar pentru a încărca și analiza xml într-un XmlDocument
(pentru metoda System.Xml ) sau XDocument
pentru toți ceilalți).
The LINQ algorithms I used were: (C# - all take an XElement
"parent" and return the inner xml string)
CreateReader:
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
Agregat cu concatenare șir:
return parent.Nodes().Aggregate("", (b, node) => b += node.ToString());
StringBuilder:
StringBuilder sb = new StringBuilder();
foreach(var node in parent.Nodes()) {
sb.Append(node.ToString());
}
return sb.ToString();
String.Join on array:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
String.Concat pe matrice:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
Nu am arătat algoritmul "Câmpie veche System.Xml" aici, deoarece el doar a sunat .InnerXml pe noduri.
Concluzie
Dacă performanța este importantă (de ex. O mulțime de XML, este analizată frecvent), aș folosi metoda CreateReader
de fiecare dată când . Dacă faceți doar câteva întrebări, vă recomandăm să utilizați metoda Aggregate mai concisă a lui Mike.
Dacă utilizați xml pe elemente mari cu numeroase noduri (poate 100), probabil că veți începe să vedeți beneficiul folosirii StringBuilder
prin metoda Aggregate, dar nu peste CreateReader
. Nu cred că metodele Alăturați-vă
și Concat
ar fi mai eficiente în aceste condiții datorită pedepsii de a converti o listă mare într-o gamă largă liste mai mici).