Cortes de matriz en C#

Resuelto Matthew Scharley asked hace 15 años • 20 respuestas

¿Cómo lo haces? Dada una matriz de bytes:

byte[] foo = new byte[4096];

¿Cómo obtendría los primeros x bytes de la matriz como una matriz separada? (Específicamente, lo necesito como IEnumerable<byte>)

Esto es para trabajar con Sockets. Supongo que la forma más sencilla sería dividir matrices, similar a la sintaxis de Perls:

@bar = @foo[0..40];

Lo que devolvería los primeros 41 elementos a la @barmatriz. ¿Hay algo en C# que me falta o hay alguna otra cosa que debería hacer?

LINQ es una opción para mí (.NET 3.5), si eso ayuda.

Matthew Scharley avatar Jan 02 '09 17:01 Matthew Scharley
Aceptado

Podrías usar ArraySegment<T>. Es muy liviano ya que no copia la matriz:

string[] a = { "one", "two", "three", "four", "five" };
var segment = new ArraySegment<string>( a, 1, 2 );
Mike Scott avatar Jan 02 '2009 12:01 Mike Scott

Las matrices son enumerables, por lo que fooya son ellas IEnumerable<byte>mismas. Simplemente use métodos de secuencia LINQ Take()para obtener lo que desea (no olvide incluir el Linqespacio de nombres con using System.Linq;):

byte[] foo = new byte[4096];

var bar = foo.Take(41);

Si realmente necesita una matriz de cualquier IEnumerable<byte>valor, puede usar el ToArray()método para eso. Ese no parece ser el caso aquí.

peSHIr avatar Jan 02 '2009 10:01 peSHIr

Podrías usar el CopyTo()método de matrices.

O con LINQ puedes usar Skip()y Take()...

byte[] arr = {1, 2, 3, 4, 5, 6, 7, 8};
var subset = arr.Skip(2).Take(2);
Arjan Einbu avatar Jan 02 '2009 10:01 Arjan Einbu

A partir de C# 8.0/.Net Core 3.0

Se admitirá la división de matrices, junto con los nuevos tipos Indexque Rangese agregarán.

Rango Documentos de estructura
Índice Documentos de estructura

Index i1 = 3;  // number 3 from beginning
Index i2 = ^4; // number 4 from end
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.WriteLine($"{a[i1]}, {a[i2]}"); // "3, 6"

var slice = a[i1..i2]; // { 3, 4, 5 }

Ejemplo de código anterior tomado del blog de C# 8.0 .

tenga en cuenta que el ^prefijo indica contar desde el final de la matriz. Como se muestra en el ejemplo de documentos.

var words = new string[]
{
                // index from start    index from end
    "The",      // 0                   ^9
    "quick",    // 1                   ^8
    "brown",    // 2                   ^7
    "fox",      // 3                   ^6
    "jumped",   // 4                   ^5
    "over",     // 5                   ^4
    "the",      // 6                   ^3
    "lazy",     // 7                   ^2
    "dog"       // 8                   ^1
};              // 9 (or words.Length) ^0

Rangey Indextambién trabajar fuera de matrices de corte, por ejemplo con bucles

Range range = 1..4; 
foreach (var name in names[range])

Recorrerá las entradas 1 a 4


tenga en cuenta que al momento de escribir esta respuesta, C# 8.0 aún no se ha lanzado oficialmente.
C# 8.x y .Net Core 3.x ahora están disponibles en Visual Studio 2019 y posteriores.

Remy avatar Apr 03 '2019 15:04 Remy