Question

Is there an in-built way to splice an IEnumerable in Linq-To-Objects?

Something like:

List<string> options = new List<string>(); // Array of 20 strings
List<string> lastOptions = options.Splice(1, 5); // Gets me all strings 1 through 5 into a new list
Was it helpful?

Solution

Try:

List<string> options = new List<string>();
List<string> lastOptions = options.Skip(0).Take(5).ToList();

skip is used to show how to skip x elements (tnx drch)


You could create something like this: (extension method)

public static class SpliceExtension
{
    public static List<T> Splice<T>(this List<T> list, int offset, int count)
    {
        return list.Skip(offset).Take(count).ToList();
    }
}

But this will only be available to Lists.


You could also use it on IEnumerable<>

public static class SpliceExtension
{
    public static IEnumerable<T> Splice<T>(this IEnumerable<T> list, int offset, int count)
    {
        return list.Skip(offset).Take(count);
    }
}

This way the List isn't iterated completely.

use it like:

List<string> lastOptions = options.Splice(1, 5).ToList();

I like this way more, because it can be used on several linq queries.

OTHER TIPS

There is no mentioning yet of the difference between JavaScript's slice and splice.

Note that splice also changes the original array in JavaScript whereas slice does not. The accepted answer is therefore a port of slice.

For completeness, here's a port of splice:

public static class SpliceExtension
{
    public static List<T> Splice<T>(this List<T> list, int start, int count)
    {
        var listWithDeletedElements = list.GetRange(start, count);
        list.RemoveRange(start, count);
        return listWithDeletedElements;
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top