2010-08-27 9 views
5

मैं एक foreach बयान का उपयोग किए बिना ManagementObjectCollection में ManagementObjects का उपयोग करने की कोशिश कर रहा हूँ, शायद मैं कुछ याद कर रहा हूँ, लेकिन मैं इसे कैसे करना समझ नहीं कर सकते हैं, मैं निम्नलिखित की तरह कुछ करने की ज़रूरत है :सी # एक्सेस करना ManagementObjectCollection में प्रबंधन वस्तुओं

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

ManagementObjectCollection queryCollection = query.Get(); 

ManagementObject mo = queryCollection[0]; 

उत्तर

3

ManagementObjectCollection IEnumerable या ICollection को लागू करता है, तो या तो आप IEnumerable (यानी foreach) या CopyTo ICollection के माध्यम से एक सरणी के माध्यम से इसे पुनरावृति करना होगा।

लेकिन जब से यह IEnumerable का समर्थन करता है आप Linq का उपयोग कर सकते हैं:

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

OfType<ManagementObject> आवश्यकता है क्योंकि ManagementObjectCollection IEnumerable का समर्थन करता है, लेकिन नहीं IEnumerable of T

+1

मैं 'जोड़ने के लिए OfType' ...' ManagementObject मो = queryCollection.OfType <जरूरत । ManagementObject>() पहले();। ' –

+1

मैं' नहीं दिख रहा है FirstOrDefault() '' ManagementObject' में या तो, केवल 'OfType () FirstOrDefault()' मुझे – Jack

+0

के लिए काम किया किसी के लिए जो जैसा कि मैं था, उलझन में है, इस जवाब में एक टाइपो है। यह पढ़ना चाहिए:। 'ManagementObject मो = queryCollection.OfType () FirstOrDefault()' – SGS

0

आप शायद भूल रहे हैं डाली: (। और के रूप में इस तरह के एक टाइप इंडेक्सर नहीं है)

ManagementObject mo = (ManagementObject)queryCollection[0]; 

... के रूप में मुझे नहीं लगता कि ManagementObjectCollection सामान्य है

+0

-1 missleading के लिए, सरणी अनुक्रमण साथ ManagementObjectCollection उपयोग नहीं कर सकते। यहां मेरी त्रुटि का एक स्क्रीनशॉट है: https://i.imgur.com/FBVXeA2.png – Katianie

3

आप नहीं कर सकते हैं प्रबंधनऑब्जेक्ट कोलेक्शन (न ही एक पूर्णांक सूचकांक) से सीधे linq को कॉल करें। आप IEnumerable करने के लिए यह पहली बार कास्ट करने के लिए है:

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

var manObj = queryCollection.FirstOrDefault(); 
1

ManagementObjectCollection Indexers लागू करता है नहीं है, लेकिन हाँ आप कर सकते हैं आप FirstOrDefault विस्तार समारोह यदि आप LINQ लेकिन गीक्स जो .net 3 या उससे पहले (प्रयोग कर रहे हैं मेरे जैसे अभी भी प्रयोग कर रहे हैं 1.1 पर काम कर रहा है) निम्नलिखित कोड का उपयोग कर सकते हैं, यह किसी भी संग्रह से लागू प्रथम आइटम प्राप्त करने का मानक तरीका है INumerable इंटरफेस।

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

के बाद किसी भी सूचकांक से ManagementObject पुनः प्राप्त करने के दो अलग अलग तरीकों रहे

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

या

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"); 
} 
संबंधित मुद्दे