Skip to content

Instantly share code, notes, and snippets.

@christiannagel
Created July 10, 2018 14:48
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save christiannagel/75360c657d0bc3cd3ceea749f797fdbd to your computer and use it in GitHub Desktop.
Save christiannagel/75360c657d0bc3cd3ceea749f797fdbd to your computer and use it in GitHub Desktop.
Extension methods needed from C# 8 range and index features
static class Extensions
{
public static int get_IndexerExtension(this int[] array, Index index) =>
index.FromEnd ? array[array.Length - index.Value] : array[index.Value];
public static int get_IndexerExtension(this Span<int> span, Index index) =>
index.FromEnd ? span[span.Length - index.Value] : span[index.Value];
public static char get_IndexerExtension(this string s, Index index) =>
index.FromEnd ? s[s.Length - index.Value] : s[index.Value];
public static Span<int> get_IndexerExtension(this int[] array, Range range) =>
array.Slice(range);
public static Span<int> get_IndexerExtension(this Span<int> span, Range range) =>
span.Slice(range);
public static string get_IndexerExtension(this string s, Range range) =>
s.Substring(range);
public static Span<T> Slice<T>(this T[] array, Range range) =>
=> array.AsSpan().Slice(range);
public static Span<T> Slice<T>(this Span<T> span, Range range)
{
var (start, length) = GetStartAndLength(range, span.Length);
return span.Slice(start, length);
}
public static string Substring(this string s, Range range)
{
var (start, length) = GetStartAndLength(range, s.Length);
return s.Substring(start, length);
}
private static (int start, int length) GetStartAndLength(Range range, int entityLength)
{
var start = range.Start.FromEnd ? entityLength - range.Start.Value : range.Start.Value;
var end = range.End.FromEnd ? entityLength - range.End.Value : range.End.Value;
var length = end - start;
return (start, length);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment