Как сделать срез списка в С#?

Рейтинг: 0Ответов: 2Опубликовано: 15.01.2023

Имеем массив a, из которого мы берем каким-либо методом (в этом случае split) срез, с которым можно было дальше работать как с обычным массивом. Каким образом такое можно сделать?

string[] a = { "one", "two", "three", "four", "five" };
string[] b = a.Split(0, 2);

Ответы

▲ 1

В C# 8 добавили Ranges, можно сделать так:

string[] a = { "a", "b", "c", "d" };
var b = a[0..2]; //["a", "b"]
var c = a[1..3];

Старые способы:

  1. С помощью LINQ:
string[] a = { "a", "b", "c", "d" };
var b = a.Take(2).ToArray(); //["a", "b"], если нужно пропустить, например, 1 элемент, то перед Take можно использовать Skip (см. пример для переменной c).
var c = a.Skip(1).Take(2).ToArray(); //["b", "c"]
  1. С помощью ArraySegment:
string[] a = { "a", "b", "c", "d" };
var b = new ArraySegment<string>(a, 0, 2).ToArray(); //["a", "b"]
var c = new ArraySegment<string>(a, 1, 2).ToArray(); //["b", "c"]
  1. С помощью копирования массива:
public static class ArraySliceExtension
{
    public static T[] ArraySlice<T>(this T[] array, int offset, int size)
    {
        var result = new T[size];
        Array.Copy(array, offset, result, 0, size);

        return result;
    }
}
string[] a = { "a", "b", "c", "d" };
var b = a.ArraySlice(0, 2); //["a", "b"]
var c = a.ArraySlice(1, 2); //["b", "c"]
▲ 0

Естественно, для краткости кода, я пренебрег некоторыми проверками выхода за границы массива и т д. Как были замечены мною ошибки к инструкциям использования, это расширение должно быть в статичном классе. Метод способен копировать поддерживаемы стандартные типы языка.

private static void Main()
{
    string[] a = new string[5] { "one", "two", "three", "four", "five" };
    string[] b = a.Split(1, 2);

    Console.Write(string.Join(", ", b));
    Console.ReadLine();
}

private static TArray[] Split<TArray>(this TArray[] sources, int first, int second)
{
    if (sources == null)
        throw new ArgumentNullException(nameof(sources));

    TArray[] result = new TArray[second];
    Array.Copy(sources, first, result, 0, second);

    return result;
}