Получение подмассива из существующего массива - PullRequest
292 голосов
/ 03 июня 2009

У меня есть массив X из 10 элементов. Я хотел бы создать новый массив, содержащий все элементы из X, которые начинаются с индекса 3 и заканчиваются индексом 7. Конечно, я могу легко написать цикл, который сделает это для меня, но я бы хотел сохранить свой код как можно более чистым , Есть ли в C # метод, который может сделать это для меня?

Что-то вроде (псевдокод):

Array NewArray = oldArray.createNewArrayFromRange(int BeginIndex , int EndIndex)

Array.Copy не соответствует моим потребностям . Мне нужно, чтобы элементы в новом массиве были клонами. Array.copy это просто эквивалент C-Style memcpy, это не то, что я ищу.

Ответы [ 22 ]

0 голосов
/ 20 августа 2014
public   static   T[]   SubArray<T>(T[] data, int index, int length)
        {
            List<T> retVal = new List<T>();
            if (data == null || data.Length == 0)
                return retVal.ToArray();
            bool startRead = false;
            int count = 0;
            for (int i = 0; i < data.Length; i++)
            {
                if (i == index && !startRead)
                    startRead = true;
                if (startRead)
                {

                    retVal.Add(data[i]);
                    count++;

                    if (count == length)
                        break;
                }
            }
            return retVal.ToArray();
        }
0 голосов
/ 13 июля 2009

Что касается клонирования, я не думаю, что сериализация вызывает ваши конструкторы. Это может нарушить инварианты класса, если вы делаете интересные вещи в ctor'е.

Кажется, безопаснее ставить виртуальные методы-клоны, вызывающие конструкторы копирования.

protected MyDerivedClass(MyDerivedClass myClass) 
{
  ...
}

public override MyBaseClass Clone()
{
  return new MyDerivedClass(this);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...