2008-12-12 10 views

Respuesta

16

La forma más sencilla de hacer esto es:

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

Pero esto no es particularmente eficiente si en realidad es una colección genérica porque IEnumerator implementa IDisposable, por lo que el compilador tiene que poner en un try/finally, con una llamada Dispose() en el bloque finally.

Si se trata de una colección no genérica, o si conoce la colección genérica implementa nada en su método Dispose(), entonces el siguiente se puede utilizar:

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

Si sabe si puede aplicar IList, se puede hacer esto:

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

del mismo modo, si lo más probable es que va a ser de un tipo determinado de su propia definición que tiene algún tipo de acceso indexado, puede utilizar la misma técnica.

3

Sin genéricos y debido ICollection implementos IEnumerable se puede hacer como en el ejemplo 1. Con los genéricos que sencilla necesidad de hacer como ejemplo 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

ejemplo 2 no es correcto porque ICollection no implementa un único método(). –

+0

Este es un método de extensión Linq. Eche un vistazo a msdn doc: http://msdn.microsoft.com/en-us/library/y2fx0ty0.aspx –

62

LINQ, bebé, sí ...

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 se define en ICollection o IEnumerable (no genérico)? ¿Dónde? Lo que funcionaría sin embargo: myICollection.OfType () .FirstOrDefault(); –

+0

Es cierto, actualizado. Gracias. – Will

+3

Esta es la respuesta correcta. First y FirstOrDefault incluso usan esa optimización IList internamente siempre que sea posible. –

0

.

collection.ToArray()[i] 

De esta manera es lento, pero muy fácil de usar

+2

Esto copia toda la colección solo para obtener un valor. – Matt

+1

"Sabemos que la Colección está vacía aparte de eso". En aras de la simplicidad, lo anterior tendría sus usos. Aunque no es la mejor respuesta genérica ya que sería abusada. – Skarsnik

Cuestiones relacionadas