2011-01-24 40 views
17

Tengo en instancia de la clase foo y quiero devolverlo como IEnumerable. ¿Puedo hacerlo sin crear una nueva lista, etc ..devuelve objeto de instancia única como IEnumerable

Tal vez algo como lo siguiente:

IEnumerable<foo>.fromInstance(foo) 
+2

posible duplicado de [Pasar un solo elemento como IEnumerable ] (http://stackoverflow.com/questions/1577822/passing-a-single-item-as-ienumerablet) – nawfal

+0

Posible duplicado de [Pasar un solo elemento como IEnumerable ] (https://stackoverflow.com/questions/1577822/passing-a-single-item-as-ienumerablet) –

Respuesta

20

Opciones:

  • crear una instancia de una clase de colección, como una matriz o una lista. Esto sería mutable por defecto, lo que sería poco útil si se trata de una secuencia que desea distribuir en su API. Sin embargo, podría crear un contenedor ReadOnlyCollection<T> alrededor de dicha colección.
  • Escribe tu propio bloque de iteradores según la respuesta de Botz3000
  • Usa Enumerable.Repeat(item, 1) desde LINQ, si estás utilizando .NET 3.5.

La mejor respuesta aquí depende del uso. Si solo necesita esto para llamar a otro método que usa una secuencia, y usted sabe que no se modificará, probablemente use una matriz. Por ejemplo, con el fin de llamar Concat en alguna otra secuencia, es posible que desee:

var wholeList = regularList.Concat(new[] { finalValue }); 

Tengo confianza en que Concat no va a mutar la matriz, y nada más verá siempre la referencia a la propia matriz .

Si necesita devolver la secuencia a algún otro código, y no sabe qué podría hacer con él, probablemente usaría Enumerable.Repeat.

+0

una opción más para quienes usan Rx (http://msdn.microsoft.com/en-us/devlabs/ee794896) es el método EnumerableEx.Return. –

+0

Falta la manera más limpia: 'new [] {item}' – data

+0

@data_smith: ¿Cómo no está cubierto por "Crear una instancia de una clase de colección, como una matriz o una lista"? –

12

La mejor manera idiomática de hacerlo es algo así como new[] { foo } que acaba crea una matriz de 1 elemento de cualquiera que sea el tipo foo es declarado.

La única desventaja de esto es que las matrices no son inmutables, por lo que alguien puede convertir su IEnumerable<T> a y cambiar el valor allí. Sin embargo, esto es bastante improbable, así que no me preocupo.

+0

Breve, conciso, limpio. Esto debería estar en la parte superior y aceptado. +1 – data

0

Se supone que IENumerable se utiliza para algo que puede enumerar, por lo que usarlo para una sola instancia parece bastante extraño. Si realmente lo necesita, puede hacerlo de esta manera. Podría ser una mejor manera, pero esto debe hacer el trabajo:

List<foo> myList = new List<foo>(); 
myList.Add(myInstanceOfFoo); 
IEnumerable myEnumerable = myList.AsEnumerable(); 

Independientemente de cómo se ve esto, usted está tratando realmente de hacer una lista de un solo elemento, y luego es realmente ninguna razón para hacerlo una lista.

+3

Puede haber muchas razones para convertir un solo objeto en IEnumerable. P.ej.uno podría querer pasarlo a un método que espera IEnumerable, o podría ser utilizado para emular Maybe monad etc. –

17

usted puede hacer esto:

public IEnumerable<Foo> GetSingleFooAsEnumerable() { 
    yield return singleFoo; 
} 
+0

Respiro esta respuesta; esta técnica también es útil para enumerar variables específicas de miembros. – Apelsin

Cuestiones relacionadas