ArraySegment - Возврат фактического сегмента C #

Я искал способы вернуть сегмент, который в основном удерживается ArraySegment с точки зрения смещения и количества. Хотя ArraySegment содержит полный исходный массив, он просто ограничивает его тем фактом, что любые изменения в сегменте отражаются в исходном массиве. Проблема или, скажем, ограничение с ArraySegment заключается в том, что он не будет возвращать сам сегмент в целом, и я должен перемещаться по значениям. Как лучше всего вернуть сегмент в целом?

 byte[] input = new byte[5]{1,2,3,4,5};
 ArraySegment<byte> delimited = new ArraySegment<byte>(input,0,2);
 byte[] segment = HERE I NEED SOMETHING THAT WILL RETURN THE SEGMENT i.e. [0,1,2]

Самый важный момент: сегмент не должен быть копией, а должен ссылаться на исходный массив. Если в сегмент внесены какие-либо изменения, они должны быть отражены в исходном массиве.

Любые подсказки приветствуются, спасибо!

ЭТАЛОННЫЕ МАТЕРИАЛЫ НАЗНАЧЕНИЯ : После некоторых ответов от Томаса и digEmAll

Хорошо, я провел несколько тестов по коду из digEmAll и Thomas, и, к моему удивлению, этот код намного быстрее. Именно то, что я отчаянно искал. Вот результаты.

Construct             Size    Elements assigned    Iterations       Time
_______________________________________________________________________________

ArraySegmentWrapper   1500        1500              1000000       396.3 ms
Array.Copy            1500        1500              1000000       4389.04 ms

Как вы видите колоссальную разницу, мне совершенно ясно, что я буду использовать код для ArraySegment. Ниже приведен тестовый код. Обратите внимание, что это может быть немного предвзято, поскольку люди будут спорить, почему «новое» было помещено в цикл. Я просто пытаюсь воспроизвести ситуацию, которая есть у меня в настоящее время, чтобы разрешить ее в максимально возможной степени, не перемещая большую часть кода. Это просто сделало мой день!

namespace ArraySegmentWrapped
{
    class Program
    {

        public static Stopwatch stopWatch = new Stopwatch();
        public static TimeSpan span = new TimeSpan();
        public static double totalTime = 0.0;
        public static int iterations = 1000000;

        static void Main(string[] args)
        {
            int size = 1500;
            int startIndex = 0;
            int endIndex = 1499;
            byte[] array1 = new byte[size];
            byte[] array2 = null;

            for (int index = startIndex; index < size; index++)
            {
                array1[index] = (byte)index;
            }

            ArraySegmentWrapper<byte> arraySeg;

            for (int index = 0; index < iterations; index++)
            {
                stopWatch.Start();
                arraySeg = new ArraySegmentWrapper<byte>(array1, startIndex, endIndex);            
                stopWatch.Stop();
                totalTime += stopWatch.Elapsed.TotalMilliseconds;
            }

            Console.WriteLine("ArraySegment:{0:F6}", totalTime / iterations);
            stopWatch.Reset();
            totalTime = 0.0;

            for (int index = 0; index < iterations; index++)
            {
                stopWatch.Start();
                array2 = new byte[endIndex - startIndex + 1];
                Array.Copy(array1, startIndex, array2, 0, endIndex);
                stopWatch.Stop();
                totalTime += stopWatch.Elapsed.TotalMilliseconds;
            }
            Console.WriteLine("Array.Copy:{0:F6}", totalTime / iterations);                        


        }
    }
// Code for ArraySegmentWrapper goes here    

}

ДОСТУП К ЭТАЛОНАМ (Обновлено) Итак, после того, что Томас указал на тесты и сказал, что доступ к простым массивам будет быстрее по сравнению с ArraySegment, он был полностью прав. Но когда digEmAll указал, что я должен тестировать в режиме Release (извините за старую ошибку тестирования в режиме отладки), я оставил код почти таким же, как указано выше (итерации уменьшены на два нуля - не мог долго ждать вывода на Приходите, извините) и некоторые модификации для доступа к тому же количеству элементов. Ниже представлено то, что я получил.

Construct             Size    Elements accessed    Iterations       Time
_______________________________________________________________________________

ArraySegmentWrapper   1500        1500              1000000       5268.3 ms
Array.Copy            1500        1500              1000000       4812.4 ms

Сделал вывод, что, хотя присвоение выполняется очень быстро, доступ через сегменты ArraySegments выполняется медленно.

15
задан Community 23 May 2017 в 12:18
поделиться