从集合到列表的最快转换


69

我要避免的是:

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

Answers:


129

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

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

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


您的转换可能会失败,您需要使用ManagementBaseObject。
mancaus

如果我们要创建List <ManagementObject>,则不需要。也许OfType <ManagementObject>是一个合理的折衷方案?
马克·格雷韦尔

如何将managementobjectcollection转换为IEnumerable <IEnumerable <IPropertyData >>,其中propertydata仅是名称和值?
Nisha 2013年

我建议您撤消您的编辑,因为许多人最终将使用可能支持泛型的其他集合。
基本

35

你可以用

using System.Linq;

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


9
我经常遇到这个问题-“为什么没有ToList()”?.... Google .... DOH!我似乎永远都不会记得包括using System.Linq;
Percy 2015年

1
ObjectCollection中没有ToList()。
joaocarlospf

包含dll或使用其他答案进行转换
jacobsgriffith

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

1
实际上,预先初始化容量不会节省大量时间。该列表将以双倍策略增长,因此不必多次调整大小。维护的代码也更少。
马克·格雷韦尔

(尤其是与IEnumeable和Cast的迭代器块的开销进行比较时)
马克·

2

从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 <ManagementObject>,您就可以执行以下操作:

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

如果没有,那么您就只能按照自己的方式去做。


1
问题是:没有;没有。它仅实现ICollection,IEnumerable,IDisposable
Marc Gravell

@马克·格雷夫(Marc Gravell):然后,他被困在做事的路上。IEnumerable <T> ctor基本上还是在做同样的事情。
MagicKat

-2

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

Collection<A> obj=new Collection<return ListRetunAPI()>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.