Какие задачи решает структура ArraySegment<T>?

339
12 мая 2017, 14:04

Какие задачи решает структура ArraySegment?

С виду, похоже, что копирует кусок массива в эту структуру и позволяет ее изменять отдельно от основного массива и не портя исходного массива.

Разве не тоже самое можно получить созданием List ?

Answer 1

Я кажется понял его основной смысл:

Можно исходный массив обернуть в ArraySegment'ы и передать его в потоки и в итоге потоки будут работать с сегментом не подозревая, что это кусок массива(так как индексация сегмента будет с 0 если не использовать смещение).

Поправьте, если я не прав.

Answer 2

Когда требуется работать не со всем массивом данных, а лишь с его частью, нужно передать в метод три параметра: ссылку на сам массив, индекс начала, количество элементов.

void Foo(int[] array, int startIndex, int count)

Если при этом нужны и другие параметры, то сигнатура метода становится длинной и малопонятной:

void Foo(int[] array, int startIndex, int count, SomeTypeA param1, SomeTypeB param2)

Есть распространённый способ рефакторинга: замена параметров объектом (структурой). Я так понимаю, что ArraySegment как раз и является таким объектом, заранее введённым разработчиками фреймворка.

void Foo(ArraySegment<int> segment)
void Foo(ArraySegment<int> segment, SomeTypeA param1, SomeTypeB param2)

Такая сигнатура несколько проще.

Конечно, можно и для других параметров ввести свой объект (но его нужно предварительно написать самим):

void Foo(ArraySegment<int> segment, SomeObject obj)

То, что массивы ныне совсем мало используются по сравнению с другими коллекциями, совсем другой вопрос.

Answer 3

Тут смотреть не пробовали?

Структура ArraySegment - Определяет границы фрагмента одномерного массива. И методы описаны и весь букет.

Вот простой пример использования:

var array = new byte[] { 5, 8, 9, 20, 70, 44, 2, 4 };
array.Dump();
var segment = new ArraySegment<byte>(array, 2, 3);
segment.Dump(); // output: 9, 20, 70
segment.Reverse().Dump(); // output 70, 20, 9
segment.Any(s => s == 99).Dump(); // output false
segment.First().Dump(); // output 9
array.Dump(); // no change
READ ALSO
Копирование файлов по локальной сети с аутентификацией

Копирование файлов по локальной сети с аутентификацией

Есть консольное приложение, в котором нужно копировать файлы по локальной сети как с аутентификацией так и безЗнаю, что без аутентификации...

326
В чем разница между int.Parse() и Convert.ToInt32()

В чем разница между int.Parse() и Convert.ToInt32()

В чем разница между intParse() и Convert

322
Получение ID нескольких процессов

Получение ID нескольких процессов

Нужно получить ID определенных процессов

239