74

我想避免的:

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);
4

7 回答 7

133

什么版本的框架?使用 3.5,您大概可以使用:

List<ManagementObject> managementList = managementObjects.Cast<ManagementObject>().ToList();

(编辑删除更简单的版本;我检查并ManagementObjectCollection只实现了非通用IEnumerable形式)

于 2008-10-09T15:53:42.487 回答
41

你可以使用

using System.Linq;

这将为您提供 ICollection<> 的 ToList<> 扩展方法

于 2015-08-02T01:32:40.717 回答
4

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;
        }
    }
于 2008-10-09T16:05:00.357 回答
2

从 3.5 开始,从 System.Collection.IEnumerable 继承的任何东西都有方便的扩展方法 OfType 可用。

如果您的集合来自 ICollection 或 IEnumerable,您可以这样做:

List<ManagementObject> managementList = ManagementObjectCollection.OfType<ManagementObject>().ToList();

找不到更简单的方法。:)

于 2012-09-20T17:41:34.330 回答
1

你可以试试:

List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.ToArray());

不确定 .ToArray() 是否可用于该集合。如果您确实使用了您发布的代码,请确保使用现有元素的数量初始化列表:

List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.Count);  // or .Length
于 2008-10-09T15:53:28.603 回答
0

只要 ManagementObjectCollection 实现 IEnumerable<ManagementObject> 你可以这样做:

List<ManagementObject> managementList = new List<ManagementObjec>(managementObjects);

如果没有,那么你就被困在你正在做的事情上。

于 2008-10-09T16:02:41.330 回答
-2

你可以像下面的代码片段一样转换

Collection<A> obj=new Collection<return ListRetunAPI()>
于 2009-03-16T06:25:56.213 回答