从集合到列表最快的转换<T>

问题描述 投票:0回答:8

我想避免的:

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);
c# collections
8个回答
141
投票

框架是什么版本?对于 3.5,你大概可以使用:

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

(编辑以删除更简单的版本;我检查过并且

ManagementObjectCollection
仅实现非通用
IEnumerable
形式)


43
投票

你可以使用

using System.Linq;

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


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

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

如果没有,那么你就只能按照现在的方式去做。


0
投票

使用 Linq 的另一个解决方案是:

List<ManagementObject> managementList = (from ManagementObject m in managementObjects select m).ToList();

-2
投票

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

Collection<A> obj=new Collection<return ListRetunAPI()>
© www.soinside.com 2019 - 2024. All rights reserved.