2010-08-27 8 views
5

Sto cercando di accedere a ManagementObjects in ManagementObjectCollection senza utilizzare un'istruzione foreach, forse mi manca qualcosa ma non riesco a capire come farlo, ho bisogno di fare qualcosa come il seguente :C# Accesso agli oggetti di gestione in ManagementObjectCollection

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

ManagementObjectCollection queryCollection = query.Get(); 

ManagementObject mo = queryCollection[0]; 

risposta

3

ManagementObjectCollection implementa IEnumerable o ICollection, quindi o deve scorrere via IEnumerable (cioè foreach) o CopyTo un array tramite ICollection.

Tuttavia dato che supporta IEnumerable è possibile utilizzare Linq:

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

OfType<ManagementObject> è necessario perché ManagementObjectCollection supporta IEnumerable ma non IEnumerable of T.

+1

avevo bisogno di aggiungere '' OfType' ... mo ManagementObject = queryCollection.OfType < ManagementObject>(). First(); ' –

+1

Non vedo' FirstOrDefault() 'in' ManagementObject', solo 'OfType (). FirstOrDefault()' ha funzionato per me – Jack

+0

Per chi è confuso come me, c'è un errore di battitura in questa risposta. Dovrebbe essere visualizzato: 'ManagementObject mo = queryCollection.OfType (). FirstOrDefault()' – SGS

0

Probabilmente stai manca il cast: (. E come tale non ha un indicizzatore tipizzato)

ManagementObject mo = (ManagementObject)queryCollection[0]; 

... come non credo ManagementObjectCollection è generico

+0

-1 per missleading, non può accedere a ManagementObjectCollection con indicizzazione di array. Ecco uno screenshot del mio errore: https://i.imgur.com/FBVXeA2.png – Katianie

3

Non è possibile chiama direttamente linq da ManagementObjectCollection (né un indexer intero). Bisogna gettarlo ai IEnumerable prima:

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

var manObj = queryCollection.FirstOrDefault(); 
1

ManagementObjectCollection non implementa indicizzatori, ma sì è possibile che si funzione di estensione FirstOrDefault se si sta utilizzando LINQ, ma i geek che stanno usando .net 3 o versioni precedenti (come me ancora lavorando su 1.1) può usare il seguente codice, è un modo standard per ottenere il primo elemento da qualsiasi interfaccia implementata da IEnumerable.

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

seguito sono due modi diversi per recuperare ManagementObject da qualsiasi indice

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

O

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