我想避免的:
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<ManagementObject> managementList = new List<ManagementObjec>(collection_array);
框架是什么版本?对于 3.5,你大概可以使用:
List<ManagementObject> managementList = managementObjects.Cast<ManagementObject>().ToList();
(编辑以删除更简单的版本;我检查过并且
ManagementObjectCollection
仅实现非通用IEnumerable
形式)
你可以使用
using System.Linq;
这将为您提供 ICollection<> 的 ToList<> 扩展方法
managementObjects.Cast<ManagementBaseObject>().ToList();
是一个不错的选择。
您可以通过预先初始化列表容量来提高性能:
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;
}
}
从 3.5 开始,任何从 System.Collection.IEnumerable 继承的东西都可以使用方便的扩展方法 OfType。
如果您的集合来自 ICollection 或 IEnumerable,您可以这样做:
List<ManagementObject> managementList = ManagementObjectCollection.OfType<ManagementObject>().ToList();
找不到更简单的方法。 :)
你可以尝试:
List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.ToArray());
不确定 .ToArray() 是否可用于集合。 如果您确实使用您发布的代码,请确保使用现有元素的数量初始化列表:
List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.Count); // or .Length
只要 ManagementObjectCollection 实现 IEnumerable
List<ManagementObject> managementList = new List<ManagementObjec>(managementObjects);
如果没有,那么你就只能按照现在的方式去做。
使用 Linq 的另一个解决方案是:
List<ManagementObject> managementList = (from ManagementObject m in managementObjects select m).ToList();
您可以像下面的代码片段一样进行转换
Collection<A> obj=new Collection<return ListRetunAPI()>