Si puede usar LINQ puede usar:
var e = enumerable.First();
Sin embargo, esto generará una excepción si enumerable está vacío: en cuyo caso puede usar:
var e = enumerable.FirstOrDefault();
FirstOrDefault()
regresará default(T)
si el enumerable está vacío, lo que será null
para los tipos de referencia o el 'valor cero' predeterminado para los tipos de valor.
Si no puede usar LINQ, entonces su enfoque es técnicamente correcto y no es diferente de crear un enumerador usando los métodos GetEnumerator
y MoveNext
para recuperar el primer resultado (este ejemplo supone que enumerable es un IEnumerable<Elem>
):
Elem e = myDefault;
using (IEnumerator<Elem> enumer = enumerable.GetEnumerator()) {
if (enumer.MoveNext()) e = enumer.Current;
}
Joel Coehoorn mencionado .Single()
en los comentarios; esto también funcionará si espera que su enumerable contenga exactamente un elemento; sin embargo, arrojará una excepción si está vacío o es más grande que un elemento. Hay un SingleOrDefault()
método correspondiente que cubre este escenario de manera similar a FirstOrDefault()
. Sin embargo, David B explica que SingleOrDefault()
aún puede arrojar una excepción en el caso en que el enumerable contenga más de un elemento.
Editar: Gracias Marc Gravell por señalar que necesito deshacerme de mi IEnumerator
objeto después de usarlo. Edité el ejemplo que no es de LINQ para mostrar la using
palabra clave para implementar este patrón.
En caso de que esté utilizando .NET 2.0 y no tenga acceso a LINQ:
Esto debería hacer lo que está buscando ... utiliza genéricos para que pueda obtener el primer elemento en cualquier tipo IEnumerable.
Llámalo así:
O
Puede modificarlo con la suficiente facilidad para imitar el método de extensión IEnumerable.ElementAt () de .NET 3.5:
Llamándolo así:
Por supuesto, si lo tiene acceso a LINQ, entonces hay un montón de buenas respuestas ya publicado ...
fuente
Bueno, no especificó qué versión de .Net está usando.
Suponiendo que tiene 3.5, otra forma es el método ElementAt:
fuente
FirstOrDefault ?
fuente
prueba esto
fuente
Use FirstOrDefault o un bucle foreach como ya se mencionó. Se debe evitar buscar manualmente un enumerador y llamar a Current. foreach dispondrá de su enumerador por usted si implementa IDisposable. Al llamar a MoveNext y Current, debe eliminarlo manualmente (si corresponde).
fuente
Si su IEnumerable no lo expone
<T>
y Linq falla, puede escribir un método usando la reflexión:fuente
también puedes probar la versión más genérica que te da el elemento i-ésimo
enumerable.ElementAtOrDefault (i));
Espero eso ayude
fuente