Đối với mỗi *Collection
(HtmlNodeCollection
, TreeNodeCollection
, CookieCollection
vv) Ví dụ lớp mà tôi cần phải vượt qua một phương pháp mà chỉ chấp nhận một mảng hoặc danh sách (nên không có một phương pháp mà chấp nhận một TreeNodeCollection
trong TreeView
chẳng hạn?) Tôi có để viết một phần mở rộng-phương pháp như thế này:Cách nhanh chóng để chuyển đổi Bộ sưu tập thành Mảng hoặc Danh sách?
public static TreeNode[] ToArray(this TreeNodeCollection nodes)
{
TreeNode[] arr = new TreeNode[nodes.Count];
nodes.CopyTo(arr, 0);
return arr;
}
Hoặc loop trên toàn bộ bộ sưu tập thêm các mục vào một đầu ra danh sách và sau đó chuyển đổi đầu ra-list để một mảng:
public static TreeNode[] ToArray(this TreeNodeCollection nodes)
{
var output = new List<TreeNode>();
foreach (TreeNode node in nodes)
output.Nodes(node);
return output.ToArray();
}
Vì vậy, câu hỏi của tôi là: Tôi cần phương pháp mở rộng này thường xuyên. Nó có thể phân bổ rất nhiều bộ nhớ nếu danh sách lớn, như thường lệ. Tại sao tôi không thể lấy tham chiếu (không sao chép) vào mảng nội bộ được sử dụng bởi các lớp học *Collection
này để tôi không cần phải sử dụng các tiện ích mở rộng đó và thực hiện phân bổ bộ nhớ này? hoặc thậm chí cung cấp phương thức ToArray()
. Chúng ta không cần phải biết việc triển khai thực hiện nội bộ hoặc mảng được sử dụng trong trường hợp cuối cùng của nó.
'Tôi cần chuyển sang phương thức chỉ chấp nhận một mảng hoặc danh sách' Tại sao không 'IEnumerable'? Bạn có thể dễ dàng chuyển 'treeNodeCollection.Cast ()' cho ví dụ. –
EZI
Sử dụng 'IEnumerable '. Nếu bạn cần mảng, hãy sử dụng 'collection.Cast () .ToArray()' và loại bỏ hoàn toàn các phương thức mở rộng của bạn. –
'.Cast <>()' thực sự tốt đẹp ... hiện 'collection.Cast() .ToArray()' khác với phần mở rộng '.ToArray()' của tôi (ngoài thực tế nó là bản địa, tất nhiên)? –
Jack