her *Collection
(HtmlNodeCollection
, TreeNodeCollection
, CookieCollection
vs.) yalnızca bir dizi veya liste kabul eden bir yönteme geçmesi gereken sınıf örneği (örneğin TreeView
bir TreeNodeCollection
kabul eden bir yöntem olmamalıdır?) Ben böyle bir uzantı-yöntemi yazmaya:Bir Koleksiyonu Array veya Listeye dönüştürmenin hızlı yolu? Için
public static TreeNode[] ToArray(this TreeNodeCollection nodes)
{
TreeNode[] arr = new TreeNode[nodes.Count];
nodes.CopyTo(arr, 0);
return arr;
}
Veya tüm koleksiyondan bir çıkış-listeye öğe ekleyerek ve daha sonra bir diziye çıkış listesine dönüştürme üzerinde döngü:
public static TreeNode[] ToArray(this TreeNodeCollection nodes)
{
var output = new List<TreeNode>();
foreach (TreeNode node in nodes)
output.Nodes(node);
return output.ToArray();
}
Yani, sorum şu: Sık sık bu uzantı yöntemlerine ihtiyacım var. Genelde olduğu gibi liste büyükse çok fazla bellek ayırabilir. Neden bu *Collection
sınıfları tarafından kullanılan iç diziye bir başvuru (kopya değil) alamıyorum, bu nedenle bu uzantıları kullanmam ve bu bellek ayırmalarını kullanmam gerekmedi? hatta bir ToArray()
yöntemini sağlar. Bu son durumda kullanılan iç uygulamasını veya dizisini bilmemize gerek yok.
'Yalnızca bir diziyi veya listeyi kabul eden bir yönteme geçmem gerekiyor 'IEnumerable'? Ex için treeNodeCollection.Cast () 'öğesini kolayca geçirebilirsiniz. –
EZI
IEnumerable 'kullanın. Eğer diziye ihtiyacınız varsa, "collection.Cast () .ToArray()' ı kullanın ve uzantı yöntemlerinden tamamen kurtulun. –
'.Cast <>()' gerçekten güzel ... does 'collection.Cast() .ToArray()' '.ToArray()' uzantısından farklıdır (tabii ki gerçek olduğu gerçeğinden ayrı olarak)? –
Jack