web-dev-qa-db-ja.com

コレクションからリストへの最速変換<T>

私が避けたいこと:

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

フレームワークのどのバージョンですか? 3.5では、おそらく次のものを使用できます。

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

(より単純なバージョンを削除するために編集されました;私はチェックし、ManagementObjectCollectionは非ジェネリックIEnumerableフォームのみを実装します)

122
Marc Gravell

使用できます

using System.Linq;

これにより、ICollection <>のToList <>拡張メソッドが提供されます。

32
jacobsgriffith

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

あなたが試すことができます:

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

コレクションで.ToArray()が使用可能かどうかわかりません。投稿したコードを使用する場合は、リストを既存の要素の数で初期化してください。

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

3.5以降、System.Collection.IEnumerableから継承されたものには、便利な拡張メソッドOfTypeが利用可能です。

コレクションがICollectionまたはIEnumerableからのものである場合、これを行うことができます。

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

より簡単な方法を見つけることができません。 :)

0
stoto

ManagementObjectCollectionがIEnumerable <ManagementObject>を実装している限り、次のことができます。

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

そうでない場合、あなたはあなたがそれをやっている方法でそれをやって立ち往生しています。

0
MagicKat