Me encontré con el ArraySegment<byte>
tipo mientras subclasificaba la MessageEncoder
clase.
Ahora entiendo que es un segmento de una matriz dada, toma un desplazamiento, no es enumerable y no tiene un indexador, pero todavía no entiendo su uso. ¿Alguien puede explicar con un ejemplo?
ArraySegment
enumerable en .Net 4.5.Respuestas:
ArraySegment<T>
se ha vuelto mucho más útil en .NET 4.5 + y .NET Core, ya que ahora implementa:IList<T>
ICollection<T>
IEnumerable<T>
IEnumerable
IReadOnlyList<T>
IReadOnlyCollection<T>
a diferencia de la versión .NET 4 que no implementó ninguna interfaz.
La clase ahora puede participar en el maravilloso mundo de LINQ, por lo que podemos hacer las cosas habituales de LINQ como consultar el contenido, revertir el contenido sin afectar la matriz original, obtener el primer elemento, y así sucesivamente:
fuente
GetEnumerator
privados, lo que significa que estás obligado a lanzar aIEnumerable<T>
(una conversión de boxeo) para llamarlo. ¡Uf!En este ejemplo, veremos cómo puede usar la matriz original, las propiedades Offset y Count, y también cómo puede recorrer los elementos especificados en ArraySegment.
Estructura de segmento de matriz: ¿en qué estaban pensando?
fuente
i < segment.Offset + segment.Count
.Es una estructura de pequeño soldado insignificante que no hace más que mantener una referencia a una matriz y almacena un rango de índice. Un poco peligroso, tenga en cuenta que no hace una copia de los datos de la matriz y de ninguna manera hace que la matriz sea inmutable o exprese la necesidad de inmutabilidad. El patrón de programación más típico es simplemente mantener o pasar la matriz y una variable o parámetro de longitud, como se hace en los métodos .NET BeginRead (), String.SubString (), Encoding.GetString (), etc., etc.
No se usa mucho dentro de .NET Framework, excepto por lo que parece ser un programador de Microsoft en particular que trabajó en sockets web y le gustó a WCF. Que es probablemente la guía adecuada, si te gusta, úsala. Hizo un peek-a-boo en .NET 4.6, el método MemoryStream.TryGetBuffer () agregado lo usa. Preferiría tener dos
out
argumentos, supongo.En general, la noción más universal de sectores ocupa un lugar destacado en la lista de deseos de los principales ingenieros de .NET como Mads Torgersen y Stephen Toub. Este último inició la
array[:]
propuesta de sintaxis hace un tiempo, puedes ver lo que han estado pensando en esta página de Roslyn . Asumiría que obtener soporte CLR es de lo que depende en última instancia. Esto se está considerando activamente para la versión 7 de C # afaik, manténgase atento a System.Slices .Actualización: enlace muerto, esto se envió en la versión 7.2 como Span .
Update2: más compatibilidad en la versión 8.0 de C # con los tipos Range e Index y un método Slice ().
fuente
¿Qué pasa con una clase contenedora? Solo para evitar copiar datos a búferes temporales.
Ejemplo:
Salida:
fuente
IEnumerable<T>
a continuación, añadir IEnumeratorIEnumerable.GetEnumerator() { return GetEnumerator(); }
ArraySegment es MUCHO más útil de lo que piensas. ¡Intente ejecutar la siguiente prueba unitaria y prepárese para sorprenderse!
Verá, todo lo que tiene que hacer es lanzar un ArraySegment a IList y hará todas las cosas que probablemente esperaba que hiciera en primer lugar. Observe que el tipo sigue siendo ArraySegment, aunque se comporta como una lista normal.
SALIDA:
fuente
IList<T>
. Esperaría que el indexador lo fuerapublic
.En palabras simples: mantiene la referencia a una matriz, lo que le permite tener múltiples referencias a una única variable de matriz, cada una con un rango diferente.
De hecho, le ayuda a usar y pasar secciones de una matriz de una manera más estructurada, en lugar de tener múltiples variables, para mantener el índice de inicio y la longitud. También proporciona interfaces de colección para trabajar más fácilmente con secciones de matriz.
Por ejemplo, los siguientes dos ejemplos de código hacen lo mismo, uno con ArraySegment y otro sin:
y,
Obviamente, se prefiere más el primer fragmento de código, especialmente cuando desea pasar segmentos de matriz a una función.
fuente