2009-06-19 9 views

Respuesta

121

Su ejemplo no es una secuencia vacía, es una secuencia con un elemento. Para crear una secuencia vacía de cadenas que puede hacer

var sequence = Enumerable.Empty<string>(); 

EDITAR OP aclaró que estaban buscando para crear un único valor. En ese caso

var sequence = Enumerable.Repeat("abc",1); 
+0

D'oh, me distraje, lo siento. Quise crear desde un único valor, ¡no crear una instancia vacía! –

+0

Esta es la bandera de la 'respuesta'? – n8wrl

+0

Este método es más puramente funcional que crear una nueva matriz. –

58

me gusta lo que usted sugiere, pero con el tipo de matriz omitido:

var sequence = new[] { "abc" }; 
+4

Nunca me di cuenta de que podrías hacer eso. Creo que esto es más claro que usar Repeat. –

+1

Yay tipo de inferencia. –

+0

¡Pero esto no es un IEnumerable, es una matriz! – Zodman

20

O incluso más corto,

string[] single = { "abc" }; 

Me gustaría hacer un método de extensión:

public static T[] Yield<T>(this T item) 
{ 
    T[] single = { item }; 
    return single; 
} 

O incluso mejor y más corto, simplemente

public static IEnumerable<T> Yield<T>(this T item) 
{ 
    yield return item; 
} 

Tal vez esto es exactamente lo que está haciendo Enumerable.Repeat bajo el capó.

+1

El último es brillante. Excepto por el nombre ... entrará en conflicto con los tipos que ya implementan IEnumerable, como la cadena en su ejemplo. Pruebe .AsSingleItemEnumerable() o simplemente .Yield() -> "abc" .Yield() – DanO

+0

@DanO tiene razón. Es un buen nombre. – nawfal

+6

Creo que ToEnumerable es más apropiado. – Zodman

3

o simplemente crear un método

public static IEnumerable<T> CreateEnumerable<T>(params T[] items) 
{ 
    if(items == null) 
     yield break; 

    foreach (T mitem in items) 
     yield return mitem; 
} 

o

public static IEnumerable<T> CreateEnumerable<T>(params T[] items) 
{ 
    return items ?? Enumerable.Empty<T>(); 
} 

uso:

IEnumerable<string> items = CreateEnumerable("single"); 
Cuestiones relacionadas