Я искал способы вернуть сегмент, который в основном содержится в 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 указав, что я должен тестировать в режиме выпуска (извините за старую ошибку тестирования в режиме отладки), я оставил код почти таким же, как и выше (итерации сокращены на два нуля - не мог ждать очень долго для вывода на давай, извини) и некоторые модификации для доступа к тому же количеству элементов, вот что я получил.
Construct Size Elements accessed Iterations Time
_______________________________________________________________________________
ArraySegmentWrapper 1500 1500 1000000 5268.3 ms
Array.Copy 1500 1500 1000000 4812.4 ms
Сделан вывод о том, что, несмотря на то, что задание выполняется очень быстро, доступ через ArraySegments замедляется.