2008-12-12 10 views

Répondre

16

La façon la plus simple de le faire est:

foreach(object o in collection) { 
    return o; 
} 

Mais ce n'est pas particulièrement efficace si elle est en fait une collection générique parce que IEnumerator implémente IDisposable, de sorte que le compilateur doit mettre dans un try/finally, avec un appel Dispose() dans le bloc finally.

Si c'est une collection non générique, ou si vous connaissez la collection générique met en œuvre rien dans sa méthode Dispose(), puis les éléments suivants peuvent être utilisés:

IEnumerator en = collection.GetEnumerator(); 
en.MoveNext(); 
return en.Current; 

Si vous savez si peut mettre en œuvre IList, vous peut faire:

IList iList = collection as IList; 
if (iList != null) { 
    // Implements IList, so can use indexer 
    return iList[0]; 
} 
// Use the slower way 
foreach (object o in collection) { 
    return o; 
} 

de même, s'il est probable que ce sera d'un certain type de votre propre définition qui a une sorte d'accès indexé, vous pouvez utiliser la même technique.

3

Sans génériques et parce que ICollection met en œuvre IEnumerable vous pouvez faire comme dans l'exemple 1. Avec les médicaments génériques dont vous avez besoin simple comme par exemple 2:

List<string> l = new List<string>(); 
l.Add("astring"); 

ICollection col1 = (ICollection)l; 
ICollection<string> col2 = (ICollection<string>)l; 

//example 1 
IEnumerator e1 = col1.GetEnumerator(); 
if (e1.MoveNext()) 
    Console.WriteLine(e1.Current); 

//example 2 
if (col2.Count != 0) 
    Console.WriteLine(col2.Single()); 
+0

exemple 2 est pas juste parce que ICollection ne met pas en oeuvre méthode unique(). –

+0

Ceci est une méthode d'extension Linq. Jetez un oeil à msdn doc: http://msdn.microsoft.com/en-us/library/y2fx0ty0.aspx –

62

Linq, bébé, ouais ...

var foo = myICollection.OfType<YourType>().FirstOrDefault(); 
    // or use a query 
    var bar = (from x in myICollection.OfType<YourType>() where x.SomeProperty == someValue select x) 
     .FirstOrDefault(); 
+2

FirstOrDefault est défini sur ICollection ou IEnumerable (non générique)? Où? Ce qui fonctionnerait bien: myICollection.OfType () .FirstOrDefault(); –

+0

Vrai, mis à jour. Merci. – Will

+3

C'est la bonne réponse. First et FirstOrDefault utilisent même cette optimisation IList en interne lorsque cela est possible. –

0

.

collection.ToArray()[i] 

De cette façon est lent, mais très simple à utiliser

+2

Ceci copie toute la collection juste pour obtenir une valeur. – Matt

+1

"Nous savons que la collection est vide à part cela.". Pour des raisons de simplicité, ce qui précède aurait ses utilisations. Bien que n'étant pas la meilleure réponse générique car elle serait abusée. – Skarsnik

Questions connexes