Создать ссылку на подмассив в C # (используя unsafe?) - PullRequest
5 голосов
/ 08 апреля 2010

Я занимаюсь рефакторингом библиотеки, которую мы в настоящее время используем, и столкнулся со следующей проблемой.

У нас были следующие вещи:

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

По разным причинам я заменил эту версию зубчатого массива версией 1-мерного массива, объединив внутренние массивы. У меня вопрос: как я все еще могу вернуть ссылку на подмассив data?

class Blah
{
    float[] data;
    int rows;

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

Я думал, что небезопасные и полезные материалы могут быть полезны, это выполнимо?

Ответы [ 2 ]

10 голосов
/ 08 апреля 2010

Нет, вы не можете сделать это - но вы должны смотреть на использование ArraySegment.

Обратите внимание, что объект массива состоит из метаданных о его длине и т. Д.сами данные.Вы не можете создать срез существующего массива и все еще иметь метаданные рядом с данными, если вы понимаете, что я имею в виду - должен быть дополнительный уровень косвенности (что обеспечивает ArraySegment).

(Я немного удивлен, что ArraySegment не делает больше переносов, например, реализуя IList<T>, но мы идем. Было бы достаточно легко создать такую ​​структуру, если бы вы захотели.)

1 голос
/ 08 апреля 2010

Проверьте следующий вопрос на SO, но не используйте принятый ответ (вы не хотите копировать в конце концов), а вместо этого следуйте другим вариантам использования Enumerator для фрагмента / часть исходного массива.

Массив срезов в C #

...