Как сделать срез списка в С#?
Имеем массив a, из которого мы берем каким-либо методом (в этом случае split) срез, с которым можно было дальше работать как с обычным массивом. Каким образом такое можно сделать?
string[] a = { "one", "two", "three", "four", "five" };
string[] b = a.Split(0, 2);
Ответы (2 шт):
Автор решения: Alexey
→ Ссылка
Естественно, для краткости кода, я пренебрег некоторыми проверками выхода за границы массива и т д. Как были замечены мною ошибки к инструкциям использования, это расширение должно быть в статичном классе. Метод способен копировать поддерживаемы стандартные типы языка.
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;
}
Автор решения: LiptonDev
→ Ссылка
В C# 8 добавили Ranges, можно сделать так:
string[] a = { "a", "b", "c", "d" };
var b = a[0..2]; //["a", "b"]
var c = a[1..3];
Старые способы:
- С помощью 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"]
- С помощью 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"]
- С помощью копирования массива:
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"]