ExtensionMethod.NET Home of 820 C#, Visual Basic, F# and Javascript extension methods

Slice<T>(int start, int end)

Returns the range of elements between the specified start and end indexes. Negative numbers count from the end, rather than the start, of the sequence. Values of 'end' larger than the actual sequence are truncated and do not cause index-out-of-bounds exceptions. Functionally very similar to Python's list[x:y] slices.

Source

public static IEnumerable<T> Slice<T>(this IEnumerable<T> collection, int start, int end)
{
    int index = 0;
    int count = 0;

    if (collection == null)
        throw new ArgumentNullException("collection");

    // Optimise item count for ICollection interfaces.
    if (collection is ICollection<T>)
        count = ((ICollection<T>)collection).Count;
    else if (collection is ICollection)
        count = ((ICollection)collection).Count;
    else
        count = collection.Count();

    // Get start/end indexes, negative numbers start at the end of the collection.
    if (start < 0)
        start += count;

    if (end < 0)
        end += count;

    foreach (var item in collection)
    {
        if (index >= end)
        yield break;

        if (index >= start)
        yield return item;

        ++index;
    }
}

Example

char[] h = "0123456789abcdef".ToCharArray();

var a = h.Slice(0, 3);    // returns { 0, 1, 2 }
var b = h.Slice(4, 9);    // returns { 4, 5, 6, 7, 8 }
var c = h.Slice(10, 100); // returns { a, b, c, d, e, f }
var d = h.Slice(5, 5);    // returns { }
var e = h.Slice(-10, -5); // returns { 6, 7, 8, 9, a }

Author: Joe Smith

Submitted on: 17 okt 2010

Language: C#

Type: System.Collections.Generic.IEnumerable<T>

Views: 7245