Слияние двух массивов в.NET

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

211
задан leppie 29 April 2016 в 20:34
поделиться

6 ответов

Если можно управлять одним из массивов, можно изменить размеры его прежде, чем выполнить копию:

T[] array1 = getOneArray();
T[] array2 = getAnotherArray();
int array1OriginalLength = array1.Length;
Array.Resize<T>(ref array1, array1OriginalLength + array2.Length);
Array.Copy(array2, 0, array1, array1OriginalLength, array2.Length);

Иначе, можно сделать новый массив

T[] array1 = getOneArray();
T[] array2 = getAnotherArray();
T[] newArray = new T[array1.Length + array2.Length];
Array.Copy(array1, newArray, array1.Length);
Array.Copy(array2, 0, newArray, array1.Length, array2.Length);

[еще 112] на доступных методах Массива на MSDN.

111
ответ дан Community 23 November 2019 в 04:32
поделиться

Я предполагаю, что Вы используете свои собственные типы массива в противоположность встроенным массивам.NET:

public string[] merge(input1, input2)
{
    string[] output = new string[input1.length + input2.length];
    for(int i = 0; i < output.length; i++)
    {
        if (i >= input1.length)
            output[i] = input2[i-input1.length];
        else
            output[i] = input1[i];
    }
    return output;
}

Другой способ сделать это использовал бы созданный в классе ArrayList.

public ArrayList merge(input1, input2)
{
    Arraylist output = new ArrayList();
    foreach(string val in input1)
        output.add(val);
    foreach(string val in input2)
        output.add(val);
    return output;
}

Обоими примерами является C#.

0
ответ дан takrl 23 November 2019 в 04:32
поделиться

Принятие целевого массива имеет достаточно пространства, Array.Copy() будет работать. Вы могли бы также попытаться использовать List<T> и .AddRange() метод.

5
ответ дан Joel Coehoorn 23 November 2019 в 04:32
поделиться

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

7
ответ дан GEOCHET 23 November 2019 в 04:32
поделиться

Во-первых, удостоверьтесь, что Вы задаете себе вопрос, "Я должен действительно использовать Массив здесь"?

, Если Вы не создаете что-то, где скорость имеет наибольшее значение, введенный Список, как List<int> является, вероятно, способом пойти. Единственное время я когда-либо использую массивы, для массивов байтов при отправке материала по сети. Кроме этого, я никогда не касаюсь их.

10
ответ дан CodesInChaos 23 November 2019 в 04:32
поделиться

В C# 3.0 можно использовать LINQ's метод Concat для выполнения этого легко:

int[] front = { 1, 2, 3, 4 };
int[] back = { 5, 6, 7, 8 };
int[] combined = front.Concat(back).ToArray();

В C# 2.0 у Вас нет такого прямого пути, но Массива. Копия является, вероятно, лучшим решением:

int[] front = { 1, 2, 3, 4 };
int[] back = { 5, 6, 7, 8 };

int[] combined = new int[front.Length + back.Length];
Array.Copy(front, combined, front.Length);
Array.Copy(back, 0, combined, front.Length, back.Length);

Это могло легко использоваться для реализации собственной версии Concat.

422
ответ дан Jon Schneider 23 November 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: