remarks cref c# .net icollection

cref - remarks c#



C#ICollection obtiene un valor Ășnico (4)

¿Cuál es la mejor forma de obtener un valor de ICollection? Sabemos que la Colección está vacía aparte de eso.


La forma más sencilla de hacer esto es:

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

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

Si se trata de una colección no genérica, o si sabe que la colección genérica no implementa nada en su método Dispose (), se puede usar lo siguiente:

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

Si sabe si puede implementar IList, 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 es probable que sea de un cierto tipo de su propia definición que tenga algún tipo de acceso indexado, puede usar la misma técnica.


Sin genéricos y debido a que ICollection implementa IEnumerable puede hacer lo mismo en el ejemplo 1. Con los genéricos, simplemente debe hacer como en el 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());


.

collection.ToArray()[i]

De esta manera es lento, pero muy simple de usar


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();