从集合转换为List<T>的最快方法

76

我想要避免的是:

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

请告诉我们您正在使用哪个框架。2.0与3.5有不同的解决方案。 - MagicKat
7个回答

140

框架的版本是什么?如果使用3.5版本,您可以考虑使用:

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

(编辑后删除了更简单的版本;我检查过,ManagementObjectCollection 仅实现了非泛型的 IEnumerable形式)


你的转换可能会失败,你需要使用ManagementBaseObject。 - mancaus
不,如果我们想创建一个List<ManagementObject>,我们不需要这样做。也许OfType<ManagementObject>会是一个合理的折中方案? - Marc Gravell
如何将ManagementObjectCollection转换为IEnumerable<IEnumerable<IPropertyData>>,其中IPropertyData仅包含名称和值? - Nisha
我建议您撤销编辑,因为许多人最终会使用其他可能支持泛型的集合。 - Basic

43

你可以使用

using System.Linq;

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


11
我经常遇到这个问题 - "为什么没有 ToList()"?......谷歌一下......哦!我似乎总是忘记包含 using System.Linq; - Percy
2
ObjectCollection中没有ToList()方法。 - joaocarlospf
1
包含dll或使用其他答案进行转换。 - jacobsgriffith

5

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;
        }
    }

1
实际上,预先初始化容量不会为您节省大量时间。列表将采用加倍策略增长,因此不必多次调整大小。维护的代码也更少。 - Marc Gravell
(特别是与IEnumeable和Cast的迭代器块相比时...)开销更小。 - Marc Gravell

4
自从3.5版本以来,任何继承自System.Collection.IEnumerable的对象都可以使用方便的扩展方法OfType。
如果你的集合来自于ICollection或IEnumerable,你可以这样做:
List<ManagementObject> managementList = ManagementObjectCollection.OfType<ManagementObject>().ToList();

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

1

你可以尝试:

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

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

List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.Count);  // or .Length

0
只要ManagementObjectCollection实现了IEnumerable,你就可以这样做:
List<ManagementObject> managementList = new List<ManagementObjec>(managementObjects);

如果不是这样,那么你就只能继续以目前的方式来做了。


1
问题是:它不会实现任何方法,只实现了ICollection、IEnumerable、IDisposable接口。 - Marc Gravell
@Marc Gravell:那么他只能按照他现在的方式去做。IEnumerable<T> 构造函数本质上也是在做同样的事情。 - MagicKat

-2

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

Collection<A> obj=new Collection<return ListRetunAPI()>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接