2010-04-08 11 views
5

Uaktualniam bibliotekę, której obecnie używamy, i mam do czynienia z następującym problemem.Utwórz odwołanie do podagray w języku C# (przy użyciu niebezpiecznych?)

Zwykliśmy mieć następujące rzeczy:

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

z różnych powodów, mam zastąpić tę poszarpaną wersję tablicy z 1 dimensionnal wersji tablicy, złączenie wewnętrzne tablice. Moje pytanie brzmi: jak mogę nadal zwracać odwołanie do tablicy podrzędnej data?

class Blah 
{ 
    float[] data; 
    int rows; 

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

Myślałem, że niebezpieczne i wskaźniki mogą być przydatne, czy można to zrobić?

Odpowiedz

10

Nie, nie możesz tego zrobić - ale należy spojrzeć na użyciu ArraySegment zamiast.

Należy zauważyć, że obiekt tablicy składa się z metadanych dotyczących jego długości itp., A następnie samych danych. Nie możesz utworzyć wycinka istniejącej tablicy i nadal mieć metadane obok danych, jeśli widzisz, co mam na myśli - musiałby istnieć dodatkowy poziom niedokładności (co zapewnia ArraySegment).

(Jestem nieco zaskoczony, że ArraySegment nie robi więcej owijania, na przykład poprzez wdrożenie IList<T>, ale nie idziemy. Byłoby dość łatwo stworzyć taką strukturę, jeśli chciał.)

+0

+1 nauczyć się czegoś nowego każdego dnia :-) – WestDiscGolf

+0

Zgoda, nie wiedział, że obaj. Zachowam moją odpowiedź (powinna również działać), ale wydaje się, że jest to "właściwa droga" (tm). –

+1

Układ pamięci poszarpanej tablicy sprawia, że ​​niepraktyczne jest używanie niebezpiecznych konstrukcji, aby dostać się do ich zawartości. Jeśli zastosowano tablice wielowymiarowe, można to zrobić i może być beneficjentem w (rzadkich) przypadkach narożnych, w których słaba wydajność platformy .NET na tablicach z wieloma dimami jest zbyt wolna. Ale nadal nie możesz zwrócić plasterka bez kopiowania i dodawania nowych metadanych. – Abel

0

Sprawdź następujące pytanie na temat SO, ale nie używać użyć zaakceptowanej odpowiedzi (nie chcesz w ogóle skopiować), ale raczej postępuj zgodnie z innymi opcjami użycia Enumerator dla plastra/części oryginalnej tablicy.

Array slices in C#

Powiązane problemy