2010-08-27 36 views
5

Tôi đang cố gắng truy cập vào ManagementObjects trong ManagementObjectCollection mà không sử dụng câu lệnh foreach, có thể tôi đang thiếu thứ gì đó nhưng tôi không thể tìm ra cách thực hiện, tôi cần thực hiện như sau :C# Truy cập các đối tượng quản lý trong ManagementObjectCollection

ManagementObjectSearcher query = new ManagementObjectSearcher(
    "select Name, CurrentClockSpeed from Win32_Processor"); 

ManagementObjectCollection queryCollection = query.Get(); 

ManagementObject mo = queryCollection[0]; 

Trả lời

3

ManagementObjectCollection thực hiện IEnumerable hoặc ICollection, do đó, hoặc bạn phải lặp nó qua IEnumerable (tức foreach) hoặc CopyTo một mảng qua ICollection.

Tuy nhiên kể từ khi nó hỗ trợ IEnumerable bạn có thể sử dụng LINQ:

ManagementObject mo = queryCollection.OfType<ManagementObject>().FirstOrDefault() 

OfType<ManagementObject> là cần thiết vì ManagementObjectCollection hỗ trợ IEnumerable nhưng không IEnumerable of T.

+1

tôi cần thêm 'OfType' ... 'ManagementObject mo = queryCollection.OfType < ManagementObject>(). Đầu tiên(); ' –

+1

Tôi không thấy' FirstOrDefault() 'trong' ManagementObject', hoặc chỉ 'OfType (). FirstOrDefault()' làm việc cho tôi – Jack

+0

Cho bất kỳ ai là nhầm lẫn như tôi, có một lỗi đánh máy trong câu trả lời này. Nó nên đọc: 'ManagementObject mo = queryCollection.OfType (). FirstOrDefault()' – SGS

0

Bạn đang có lẽ thiếu các diễn viên: (. Và như vậy không có một indexer đánh máy)

ManagementObject mo = (ManagementObject)queryCollection[0]; 

... như tôi không nghĩ ManagementObjectCollection là chung chung

+0

-1 cho missleading, không thể truy cập ManagementObjectCollection với mảng lập chỉ mục. Đây là một ảnh chụp màn hình lỗi của tôi: https://i.imgur.com/FBVXeA2.png – Katianie

3

Bạn có thể không trực tiếp gọi linq từ ManagementObjectCollection (cũng không phải là một chỉ số nguyên). Bạn phải cast nó để IEnumerable đầu tiên:

var queryCollection = from ManagementObject x in query.Get() 
         select x; 

var manObj = queryCollection.FirstOrDefault(); 
1

ManagementObjectCollection không thực hiện Indexer, nhưng có bạn có thể bạn chức năng mở rộng FirstOrDefault nếu bạn đang sử dụng LINQ nhưng geeks người đang sử dụng .net 3 hoặc sớm hơn (như tôi vẫn làm việc trên 1.1) có thể sử dụng mã sau đây, nó là cách tiêu chuẩn để nhận được mục đầu tiên từ bất kỳ bộ sưu tập nào được triển khai thực hiện giao diện IEnumerable.

//TODO: Do the Null and Count Check before following lines 
IEnumerator enumerator = collection.GetEnumerator(); 
enumerator.MoveNext(); 
ManagementObject mo = (ManagementObject)enumerator.Current; 

Sau đây là hai cách khác nhau để lấy ManagementObject từ bất kỳ chỉ số

private ManagementObject GetItem(ManagementObjectCollection collection, int index) 
{ 
      //TODO: do null handling 

      IEnumerator enumerator = collection.GetEnumerator(); 

      int currentIndex = 0; 
      while (enumerator.MoveNext()) 
      { 
       if (currentIndex == index) 
       { 
        return enumerator.Current as ManagementObject; 
       } 

       currentIndex++; 
      } 

      throw new ArgumentOutOfRangeException("Index out of range"); 
} 

HOẶC

private ManagementObject GetItem(ManagementObjectCollection collection, int index) 
{ 
      //TODO: do null handling 

      int currentIndex = 0; 
      foreach (ManagementObject mo in collection) 
      { 
       if (currentIndex == index) 
       { 
        return mo; 
       } 

       currentIndex++; 
      } 

      throw new ArgumentOutOfRangeException("Index out of range"); 
} 
Các vấn đề liên quan