从集合到列表最快的转换<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的IEnumerableforms)

你可以使用

 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()>