Создайте ссылку подмассива в C# (использующий небезопасный?)

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

Мы раньше имели следующий материал:

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

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

class Blah
{
    float[] data;
    int rows;

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

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

5
задан Wam 8 April 2010 в 08:59
поделиться

2 ответа

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

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

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

10
ответ дан 13 December 2019 в 19:24
поделиться

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

Срезы массивов в C #

1
ответ дан 13 December 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: