devlights
3/27/2014 - 10:28 AM

System.ArraySegment<T>

System.ArraySegment

namespace ArraySegmentSample
{
    using System;

    class Program
    {
        static void Main(string[] args)
        {
            var orig = new[] { 1, 2, 3, 4, 5 };
            var segment = new ArraySegment<int>(orig, 1, 3);

            //
            // .NET 4.0までのやり方
            //   4.0までは ArraySegment<T>はコレクションインターフェースを
            //   まったく実装していない。
            //
            for (var i = 0; i < segment.Count; i++)
            {
                Console.WriteLine(segment.Array[segment.Offset + i]);
            }

            for (var i = segment.Offset; i < (segment.Offset + segment.Count); i++)
            {
                Console.WriteLine(segment.Array[i]);
            }

            //
            // .NET 4.5からのやり方
            //   4.5から、ArraySegment<T>の宣言部分が以下のように変わった。
            //     public struct ArraySegment<T> : IList<T>, 
            //                                     ICollection<T>, 
            //                                     IReadOnlyList<T>, 
            //                                     IReadOnlyCollection<T>, 
            //                                     IEnumerable<T>, 
            //                                     IEnumerable
            //
            //var list = segment as IList<int>;
            //foreach (var item in list)
            //{
            //    Console.WriteLine(item);
            //}
        }
    }
}