2009-10-22 6 views
8

Recientemente me enfrenté a una pregunta de una entrevista relacionada con LINQ.Secuencia vacía en LINQ

¿Cuál es el uso de la secuencia vacía? .Preguntó "si supongo que te pido que uses una, ¿dónde la encajas?"

 public static IEnumerable<TResult> Empty<TResult>() 
    { 
     yield break; 
    } 

No lo he respondido. Se agradece la ayuda.

+2

¿Cómo se forma secuencia vacía? ¿Cómo te queda? – Will

+0

+1 para una buena pregunta en mi opinión. –

+0

@Stan Tengo que agradecerte mucho por aclarar mi duda. –

Respuesta

3

Puede utilizar esta opción cuando se desea crear rápidamente una IEnumerable<T> de esta manera usted no tiene que crear una referencia a un nuevo List<T> y aprovechar el rendimiento palabra clave.

List<string[]> namesList = 
    new List<string[]> { names1, names2, names3 }; 

// Only include arrays that have four or more elements 
IEnumerable<string> allNames = 
    namesList.Aggregate(Enumerable.Empty<string>(), 
    (current, next) => next.Length > 3 ? current.Union(next) : current); 

Nota el uso de Unión porque no es una listano se puede llamar Añadir método, pero se le puede llamar Unión en una IEnumerable

+0

Puede obtener un mejor rendimiento utilizando Concat en lugar de Union, a menos que realmente necesite excluir duplicados. –

+2

La forma más rápida de unirse a un montón de listas como la que usa LINQ es namesList.SelectMany (list => list.Length> 4? List: Enumerable.Empty ()). Distinct(). Hacerlo con Agregado y Unión es extremadamente ineficiente. Agregado y Concat es mejor, pero sigue siendo O (Nsquared) y O (N) espacio. SelectMany/Distinct es O (N) y O (1) espacio (solo se crean 3 objetos). –

4

Si tiene un bucle que combina conjuntos diferentes en un conjunto de resultados, puede usarlo para inicializar la variable de conjunto de resultados y bucle/acumular. Por ejemplo:

IEnumerable<string> results = Enumerable.Empty<string>(); 

for(....) 
{ 
    IEnumerable<string> subset = GetSomeSubset(...); 

    results = results.Union(subset); 
} 

Sin vacío que tendría que haber escrito un cheque nulo en su lógica de bucle:

IEnumerable<string> results = null; 

for(....) 
{ 
    IEnumerable<string> subset = GetSomeSubset(...); 

    if(results == null) 
    { 
     results = subset; 
    } 
    else 
    { 
     results = results.Union(subset); 
    } 
} 

No sólo tiene que ser un escenario de bucle y no lo hace tiene que ser Unión (podría ser cualquier función agregada), pero ese es uno de los ejemplos más comunes.

+0

Muchas gracias dibujó perdonando excelente ejemplo –

+0

Buena respuesta a la pregunta planteada. Los lectores deben tener en cuenta que mi comentario de rendimiento anterior también se aplica a este código. Usar Union de esta manera es O (Nsquared) porque crea un conjunto para cada unión y lo llena con todas las cadenas hasta el momento. Bueno, supongo que técnicamente es O (NM). El punto es que es muy lento y SelectMany/Distinct es mucho mejor para este tipo de escenario. –

Cuestiones relacionadas