Я искал способы вернуть сегмент, который в основном хранится 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]
Самый важный момент: сегмент не должен быть копией, но должен ссылаться на исходный массив. Если какие-либо изменения в сегменте выполнены, они должны быть отражены в исходном массиве.
Любые советы очень ценятся, спасибо!
НАЗНАЧЕНИЯ BENCHMARKS: после некоторых ответов Thomas и 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
}
ДОСТУПНЫЕ БЕНЧАРКИ (Обновлено) Поэтому после того, как Thomas указал на тесты и сказал, что доступ к простым массивам будет быстрее по сравнению с ArraySegment, он был абсолютно прав. Но с digEmAll, указывающим, что я должен протестировать в режиме Release (извините за старую ошибку тестирования в режиме отладки), я оставил код почти таким же, как и выше (итерации, уменьшенные на два нуля), не мог долго ждать выхода приходите, извините) и некоторые изменения для доступа к одному и тому же числу элементов. Ниже я получил.
Construct Size Elements accessed Iterations Time
_______________________________________________________________________________
ArraySegmentWrapper 1500 1500 1000000 5268.3 ms
Array.Copy 1500 1500 1000000 4812.4 ms
Завершилось, что хотя assingment очень быстрый, доступ через ArraySegments медленный.