从集合到列表最快的转换<T>
我想避免的是:
ManagementClass m = new ManagementClass("Win32_LogicalDisk"); ManagementObjectCollection managementObjects = m.GetInstances(); List<ManagementObject> managementList = new List<ManagementObject>(); foreach(ManagementObject m in managementObjects){ managementList.Add(m); }
没有办法把这个集合放到一个List里,看起来像这样:
List<ManagementObject> managementList = new List<ManagementObjec>(collection_array);
什么版本的框架? 用3.5你可能会使用:
List<ManagementObject> managementList = managementObjects.Cast<ManagementObject>().ToList();
(编辑删除更简单的版本;我检查和ManagementObjectCollection
只实现了非generics的IEnumerable
forms)
你可以使用
using System.Linq;
这将给你一个ICollection <>的ToList <>扩展方法
managementObjects.Cast<ManagementBaseObject>().ToList();
是个不错的select。
您可以通过预先初始化列表容量来提高性能:
public static class Helpers { public static List<T> CollectionToList<T>(this System.Collections.ICollection other) { var output = new List<T>(other.Count); output.AddRange(other.Cast<T>()); return output; } }
你可以尝试:
List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.ToArray());
不知道.ToArray()是否可用于集合。 如果您确实使用了发布的代码,请确保使用现有元素的数量来初始化列表:
List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.Count); // or .Length
只要ManagementObjectCollection实现了IEnumerable <ManagementObject>,你可以这样做:
List<ManagementObject> managementList = new List<ManagementObjec>(managementObjects);
如果不这样做,那么你就像你这样做的方式卡住了。
从3.5开始,从System.Collection.IEnumerableinheritance的任何东西都有方便的扩展方法OfType可用。
如果你的集合来自ICollection或IEnumerable,你可以这样做:
List<ManagementObject> managementList = ManagementObjectCollection.OfType<ManagementObject>().ToList();
找不到任何简单的方法。 :)
你可以像下面的代码片段转换
Collection<A> obj=new Collection<return ListRetunAPI()>