私が避けたいこと:
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);
フレームワークのどのバージョンですか? 3.5では、おそらく次のものを使用できます。
List<ManagementObject> managementList = managementObjects.Cast<ManagementObject>().ToList();
(より単純なバージョンを削除するために編集されました;私はチェックし、ManagementObjectCollection
は非ジェネリックIEnumerable
フォームのみを実装します)
使用できます
using System.Linq;
これにより、ICollection <>のToList <>拡張メソッドが提供されます。
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;
}
}
あなたが試すことができます:
List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.ToArray());
コレクションで.ToArray()が使用可能かどうかわかりません。投稿したコードを使用する場合は、リストを既存の要素の数で初期化してください。
List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.Count); // or .Length
3.5以降、System.Collection.IEnumerableから継承されたものには、便利な拡張メソッドOfTypeが利用可能です。
コレクションがICollectionまたはIEnumerableからのものである場合、これを行うことができます。
List<ManagementObject> managementList = ManagementObjectCollection.OfType<ManagementObject>().ToList();
より簡単な方法を見つけることができません。 :)
ManagementObjectCollectionがIEnumerable <ManagementObject>を実装している限り、次のことができます。
List<ManagementObject> managementList = new List<ManagementObjec>(managementObjects);
そうでない場合、あなたはあなたがそれをやっている方法でそれをやって立ち往生しています。