Entiendo que una lista en realidad contiene valores y una secuencia es un alias de IEnumerable<T>. En el desarrollo práctico de F #, ¿cuándo debería usar una secuencia en lugar de una lista?
Aquí hay algunas razones por las que puedo ver cuándo sería mejor una secuencia:
- Al interactuar con otros lenguajes .NET o bibliotecas que lo requieran
IEnumerable<T>. - Necesita representar una secuencia infinita (probablemente no sea realmente útil en la práctica).
- Necesita una evaluación perezosa.
¿Hay otros?

seqgenerado de esa manera producirá diferentes números aleatorios cada vez que lo mire. Eso obviamente puede ser una fuente de errores no deterministas ...Respuestas:
Creo que tu resumen de cuándo elegir
Seqes bastante bueno. Aquí hay algunos puntos adicionales:Seqpor defecto al escribir funciones, porque entonces funcionan con cualquier colección .NETSeqsi necesita funciones avanzadas comoSeq.windowedoSeq.pairwiseCreo que elegir
Seqpor defecto es la mejor opción, entonces, ¿cuándo elegiría un tipo diferente?Úselo
Listcuando necesite procesamiento recursivo usando loshead::tailpatrones(para implementar algunas funciones que no están disponibles en la biblioteca estándar)
Úselo
Listcuando necesite una estructura de datos simple e inmutable que pueda construir paso a paso(por ejemplo, si necesita procesar la lista en un hilo, para mostrar algunas estadísticas, y al mismo tiempo continuar construyendo la lista en otro hilo a medida que recibe más valores, es decir, de un servicio de red)
Úselo
Listcuando trabaje con listas cortas: la lista es la mejor estructura de datos para usar si el valor a menudo representa una lista vacía , porque es muy eficiente en ese escenarioÚselo
Arraycuando necesite grandes colecciones de tipos de valores(los arreglos almacenan datos en un bloque de memoria plano, por lo que son más eficientes en memoria en este caso)
Úselo
Arraycuando necesite acceso aleatorio o más rendimiento (y localidad de caché)fuente
List[...] cuando necesite una estructura de datos simple e inmutable que pueda construir paso a paso [...] y al mismo tiempo continuar construyendo la lista en otro hilo [...]" ¿Puede por favor ampliar su queriendo decir aquí / ¿cómo funciona? Gracias.x::xssin romper ningún trabajador existente que pueda estar en proceso de iteraciónxsTambién prefiera
seqcuando:No desea mantener todos los elementos en la memoria al mismo tiempo.
El rendimiento no es importante.
Debe hacer algo antes y después de la enumeración, por ejemplo, conectarse a una base de datos y cerrar la conexión.
No está concatenando (repetidamente
Seq.appendse desbordará la pila).Preferir
listcuando:Hay pocos elementos.
Estarás anteponiendo y decapitando mucho.
Ni
seqtampocolistson buenos para el paralelismo, pero eso tampoco significa necesariamente que sean malos. Por ejemplo, puede utilizar cualquiera de los dos para representar un pequeño grupo de elementos de trabajo separados que se realizarán en paralelo.fuente
Solo un pequeño punto:
SeqyArrayson mejores queListpor paralelismo.Tiene varias opciones: PSEQ de F # PowerPack, Array.Parallel módulo y Async.Parallel (computación asíncrona). List es terrible para la ejecución paralela debido a su naturaleza secuencial (
head::tailcomposición).fuente
ArrayoPSeqson mucho mejores.seqes mejor quelistpor paralelismo?seqtambién son horribles para la ejecución paralela debido a su naturaleza secuencial ...list es más funcional y compatible con las matemáticas. cuando cada elemento es igual, 2 listas son iguales.
la secuencia no lo es.
let list1 = [1..3] let list2 = [1..3] printfn "equal lists? %b" (list1=list2) let seq1 = seq {1..3} let seq2 = seq {1..3} printfn "equal seqs? %b" (seq1=seq2)fuente
Siempre debe exponer
Seqen sus API públicas. UtiliceListyArrayen sus implementaciones internas.fuente
Seqse ve como unIEnumerable<T>?seqson tan malos para el paralelismo.