2010-04-08 8 views
5

Estoy refactorizando una biblioteca que usamos actualmente, y me enfrenta al siguiente problema.Crear una referencia de subcampo en C# (¿usando inseguro?)

Solíamos tener el siguiente material:

class Blah 
{ 
    float[][] data; 
    public float[] GetDataReference(int index) 
    { 
     return data[index]; 
    } 
} 

Por diversas razones, he sustituido esta versión matriz escalonada con una versión de gama dimensionnal 1, la concatenación de matrices internas. Mi pregunta es: ¿cómo puedo devolver una referencia a una matriz secundaria de data?

class Blah 
{ 
    float[] data; 
    int rows; 

    public float[] GetDataReference(int index) 
    { 
     // Return a reference data from offset i to offset j; 
    } 
} 

Estaba pensando que las cosas inseguras y las indicaciones pueden ser útiles, ¿es factible?

Respuesta

10

No, no puede hacer esto, pero debería usar el ArraySegment.

Tenga en cuenta que un objeto de matriz consiste en metadatos sobre su longitud, etc. y luego los datos en sí. No puede crear una porción de una matriz existente y aún tener los metadatos al lado de los datos, si ve lo que quiero decir, tendría que haber un nivel adicional de indirección (que es lo que proporciona ArraySegment).

(estoy un poco sorprendido de que ArraySegment no hace más de envolver, por ejemplo, mediante la aplicación de IList<T>, pero hay que ir. Sería bastante fácil de crear una estructura de este tipo si se quería.)

+0

+1 se aprende algo nuevo todos los días :-) – WestDiscGolf

+0

De acuerdo, no sabía eso. Voy a mantener mi respuesta (debería funcionar también), pero esta parece ser la "forma correcta" (tm) –

+1

El diseño de la memoria de una matriz dentada hace que no sea práctico utilizar construcciones inseguras para acceder a sus contenidos. Si se usaron matrices multidimensionales, se puede hacer y puede ser beneficioso en casos de esquina (raros) donde el bajo rendimiento de .NET en arreglos multi-tenues es demasiado lento para usted. Pero aún no puede devolver una porción sin copiar y agregar los nuevos metadatos. – Abel

0

Comprobar la siguiente pregunta en SO, pero no usa use la respuesta aceptada (no desea copiar después de todo), sino más bien siga las otras opciones de usar un Enumerator para la división/subparte de la matriz original.

Array slices in C#

Cuestiones relacionadas