From 06dd0eb96dcb903b8807430abedea19f1e83d246 Mon Sep 17 00:00:00 2001 From: Alexander Radchenko Date: Mon, 12 Dec 2016 23:42:44 +0700 Subject: [PATCH] Make it easier to iterate through an ArraySegment --- .../src/System/ArraySegment.cs | 57 ++++++++----------- 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/src/System.Private.CoreLib/src/System/ArraySegment.cs b/src/System.Private.CoreLib/src/System/ArraySegment.cs index c8a20726551..84f66f20d1b 100644 --- a/src/System.Private.CoreLib/src/System/ArraySegment.cs +++ b/src/System.Private.CoreLib/src/System/ArraySegment.cs @@ -28,9 +28,9 @@ namespace System public struct ArraySegment : IList, IReadOnlyList { - private T[] _array; - private int _offset; - private int _count; + private readonly T[] _array; + private readonly int _offset; + private readonly int _count; public ArraySegment(T[] array) { @@ -110,6 +110,15 @@ public int Count } } + public Enumerator GetEnumerator() + { + if (_array == null) + throw new InvalidOperationException(SR.InvalidOperation_NullArray); + Contract.EndContractBlock(); + + return new Enumerator(this); + } + public override int GetHashCode() { if (_array == null) @@ -266,35 +275,21 @@ bool ICollection.Remove(T item) #endregion #region IEnumerable - IEnumerator IEnumerable.GetEnumerator() - { - if (_array == null) - throw new InvalidOperationException(SR.InvalidOperation_NullArray); - Contract.EndContractBlock(); - - return new ArraySegmentEnumerator(this); - } + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); #endregion #region IEnumerable - IEnumerator IEnumerable.GetEnumerator() - { - if (_array == null) - throw new InvalidOperationException(SR.InvalidOperation_NullArray); - Contract.EndContractBlock(); - - return new ArraySegmentEnumerator(this); - } + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); #endregion - private sealed class ArraySegmentEnumerator : IEnumerator + public struct Enumerator : IEnumerator { - private T[] _array; - private int _start; - private int _end; + private readonly T[] _array; + private readonly int _start; + private readonly int _end; // cache Offset + Count, since it's a little slow private int _current; - internal ArraySegmentEnumerator(ArraySegment arraySegment) + internal Enumerator(ArraySegment arraySegment) { Debug.Assert(arraySegment.Array != null); Debug.Assert(arraySegment.Offset >= 0); @@ -321,19 +316,15 @@ public T Current { get { - if (_current < _start) throw new InvalidOperationException(SR.InvalidOperation_EnumNotStarted); - if (_current >= _end) throw new InvalidOperationException(SR.InvalidOperation_EnumEnded); + if (_current < _start) + throw new InvalidOperationException(SR.InvalidOperation_EnumNotStarted); + if (_current >= _end) + throw new InvalidOperationException(SR.InvalidOperation_EnumEnded); return _array[_current]; } } - object IEnumerator.Current - { - get - { - return Current; - } - } + object IEnumerator.Current => Current; void IEnumerator.Reset() {