Per ogni *Collection
(HtmlNodeCollection
, TreeNodeCollection
, CookieCollection
ecc) un'istanza di classe che ho bisogno di passare a un metodo che accetta solo una matrice o un elenco (non dovrebbe avere un metodo che accetta un TreeNodeCollection
nel TreeView
per esempio?) Ho scrivere un'estensione a metodo come questo:Modo rapido per convertire una raccolta in serie o lista?
public static TreeNode[] ToArray(this TreeNodeCollection nodes)
{
TreeNode[] arr = new TreeNode[nodes.Count];
nodes.CopyTo(arr, 0);
return arr;
}
Oppure un loop nella raccolta completa aggiungendo gli articoli al un'uscita lista e quindi convertire l'output-elenco in un array:
public static TreeNode[] ToArray(this TreeNodeCollection nodes)
{
var output = new List<TreeNode>();
foreach (TreeNode node in nodes)
output.Nodes(node);
return output.ToArray();
}
Quindi, la mia domanda è: Ho spesso bisogno di questi metodi di estensione. Può allocare molta memoria se la lista è grande, come di solito. Perché non è possibile ottenere un riferimento (non copiare) nell'array interno utilizzato da queste classi *Collection
in modo da non dover utilizzare tali estensioni e eseguire questa allocazione di memoria? o persino fornire un metodo ToArray()
. Non abbiamo bisogno di conoscere la sua implementazione interna o la matrice utilizzata in quest'ultimo caso.
'Ho bisogno di passare a un metodo che accetta solo un array o elenco' Perché non' IEnumerable '? Puoi facilmente passare 'treeNodeCollection.Cast ()' per es. –
EZI
Utilizzare 'IEnumerable'. Se hai bisogno dell'array, usa 'collection.Cast () .ToArray()' e sbarazzati completamente dei tuoi metodi di estensione. –
'.Cast <>()' veramente bello ... fa 'collection.Cast() .ToArray()' differisce dalla mia estensione '.ToArray()' (a parte il fatto che è nativo, ovviamente)? –
Jack