Cortes de matriz en C#
¿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 Socket
s. 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 @bar
matriz. ¿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.
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 );
Las matrices son enumerables, por lo que foo
ya son ellas IEnumerable<byte>
mismas. Simplemente use métodos de secuencia LINQ Take()
para obtener lo que desea (no olvide incluir el Linq
espacio 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í.
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);
A partir de C# 8.0/.Net Core 3.0
Se admitirá la división de matrices, junto con los nuevos tipos Index
que Range
se 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
Range
y Index
tambié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.