¿Para qué sirve la clase ArraySegment ?

Acabo de encontrar el ArraySegment MessageEncoder mientras subclases la clase MessageEncoder .

Ahora entiendo que es un segmento de una matriz determinada, toma una compensación, no es enumerable y no tiene un indexador, pero aún no entiendo su uso. ¿Alguien puede explicar con un ejemplo?

ArraySegment ha vuelto mucho más útil en .NET 4.5 ya que ahora implementa:

  • IList
  • ICollection
  • IEnumerable
  • IEnumerable
  • IReadOnlyList
  • IReadOnlyCollection

a diferencia de la versión .NET 4 que no implementó interfaces de ningún tipo.

La clase ahora puede participar en el maravilloso mundo de LINQ para que podamos hacer las cosas habituales de LINQ, como consultar los contenidos, invertir los contenidos sin afectar la matriz original, obtener el primer elemento, y así sucesivamente:

 var array = new byte[] { 5, 8, 9, 20, 70, 44, 2, 4 }; array.Dump(); var segment = new ArraySegment(array, 2, 3); segment.Dump(); // output: 9, 20, 70 segment.Reverse().Dump(); // output 70, 20, 9 segment.Any(s => s == 99).Dump(); // output false segment.First().Dump(); // output 9 array.Dump(); // no change 
  1. Partición de búfer para clases de E / S: utilice el mismo búfer para las operaciones de lectura y escritura simultáneas y tenga una única estructura por la que pueda pasar. Describe su operación completa.
  2. Establecer funciones: matemáticamente hablando, puede representar cualquier subconjunto contiguo utilizando esta nueva estructura. Eso básicamente significa que puedes crear particiones de la matriz, pero no puedes representar decir todas las probabilidades y todos los pares. Tenga en cuenta que el avance de teléfono propuesto por The1 podría haber sido resuelto de manera elegante utilizando el particionamiento ArraySegment y una estructura de árbol. Los números finales podrían haber sido escritos al atravesar primero la profundidad del árbol. Este habría sido un escenario ideal en términos de memoria y velocidad, creo.
  3. Multithreading: ahora puede generar múltiples hilos para operar sobre la misma fuente de datos mientras usa arrays segmentados como la puerta de control. Los bucles que utilizan cálculos discretos ahora se pueden generar con bastante facilidad, algo que los últimos comstackdores de C ++ están comenzando a hacer como un paso de optimización de código.
  4. Segmentación de IU: limite las pantallas de IU mediante estructuras segmentadas. Ahora puede almacenar estructuras que representan páginas de datos que se pueden aplicar rápidamente a las funciones de visualización. Las matrices contiguas únicas se pueden utilizar para mostrar vistas discretas, o incluso estructuras jerárquicas, como los nodos en una vista en árbol, segmentando un almacén de datos lineal en segmentos de recostackción de nodos.

En este ejemplo, observamos cómo puede usar la matriz original, las propiedades de Compensación y Conteo, y también cómo puede recorrer los elementos especificados en ArraySegment.

 using System; class Program { static void Main() { // Create an ArraySegment from this array. int[] array = { 10, 20, 30 }; ArraySegment segment = new ArraySegment(array, 1, 2); // Write the array. Console.WriteLine("-- Array --"); int[] original = segment.Array; foreach (int value in original) { Console.WriteLine(value); } // Write the offset. Console.WriteLine("-- Offset --"); Console.WriteLine(segment.Offset); // Write the count. Console.WriteLine("-- Count --"); Console.WriteLine(segment.Count); // Write the elements in the range specified in the ArraySegment. Console.WriteLine("-- Range --"); for (int i = segment.Offset; i < segment.Count+segment.Offset; i++) { Console.WriteLine(segment.Array[i]); } } } 

ArraySegment Structure: ¿qué estaban pensando?

Es una pequeña estructura de soldados 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 ni exprese la necesidad de inmutabilidad. El patrón de progtwigció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 tiene mucho uso dentro de .NET Framework, a excepción de lo que parece ser un progtwigdor de Microsoft en particular que trabajó en sockets web y que a WCF le gusta. Cuál es probablemente la guía adecuada, si te gusta, úsala. Hizo un peek-a-boo en .NET 4.6, el método adicional MemoryStream.TryGetBuffer () lo usa. Prefiero tener dos argumentos de out , supongo.

En general, la noción más universal de slices ocupa un lugar destacado en la lista de deseos de los ingenieros principales de .NET como Mads Torgersen y Stephen Toub. Este último inició la propuesta de syntax array[:] hace un tiempo, puedes ver lo que han estado pensando en esta página de Roslyn . Asumo que obtener soporte de CLR es en lo que esto depende en última instancia. Esto está siendo pensado activamente para la versión 7 de C # afaik, eche un vistazo a System.Slices .

Actualización: vínculo inactivo, esto enviado en la versión 7.2 como span .