Makes a slice of the specified list in between the start and end indexes, getting every so many items based upon the step. - CSharp System.Collections.Generic

CSharp examples for System.Collections.Generic:List

Description

Makes a slice of the specified list in between the start and end indexes, getting every so many items based upon the step.

Demo Code

// Permission is hereby granted, free of charge, to any person
using System.Globalization;
using System.Linq;
using System.Collections;
using System.Text;
using System.Reflection;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System;/*from   w w  w.  j  a v  a 2 s .c  o  m*/

public class Main{
        /// <summary>
    /// Makes a slice of the specified list in between the start and end indexes,
    /// getting every so many items based upon the step.
    /// </summary>
    /// <param name="list">The list.</param>
    /// <param name="start">The start index.</param>
    /// <param name="end">The end index.</param>
    /// <param name="step">The step.</param>
    /// <returns>A slice of the list.</returns>
    public static IList<T> Slice<T>(IList<T> list, int? start, int? end, int? step)
    {
      if (list == null)
        throw new ArgumentNullException("list");

      if (step == 0)
        throw new ArgumentException("Step cannot be zero.", "step");

      List<T> slicedList = new List<T>();

      // nothing to slice
      if (list.Count == 0)
        return slicedList;

      // set defaults for null arguments
      int s = step ?? 1;
      int startIndex = start ?? 0;
      int endIndex = end ?? list.Count;

      // start from the end of the list if start is negitive
      startIndex = (startIndex < 0) ? list.Count + startIndex : startIndex;

      // end from the start of the list if end is negitive
      endIndex = (endIndex < 0) ? list.Count + endIndex : endIndex;

      // ensure indexes keep within collection bounds
      startIndex = Math.Max(startIndex, 0);
      endIndex = Math.Min(endIndex, list.Count - 1);

      // loop between start and end indexes, incrementing by the step
      for (int i = startIndex; i < endIndex; i += s)
      {
        slicedList.Add(list[i]);
      }

      return slicedList;
    }
        /// <summary>
    /// Makes a slice of the specified list in between the start and end indexes.
    /// </summary>
    /// <param name="list">The list.</param>
    /// <param name="start">The start index.</param>
    /// <param name="end">The end index.</param>
    /// <returns>A slice of the list.</returns>
    public static IList<T> Slice<T>(IList<T> list, int? start, int? end)
    {
      return Slice<T>(list, start, end, null);
    }
}

Related Tutorials