Как я связываю два массива в C#?

Вы не могли бы хотеть, но Ваш лучший выбор состоит в том, чтобы захватить sunfreeware CD и установить lsof.

Кроме этого, да можно унизиться вокруг в/proc со сценарием оболочки.

241
задан Peter Mortensen 1 August 2015 в 15:39
поделиться

8 ответов

var z = new int[x.Length + y.Length];
x.CopyTo(z, 0);
y.CopyTo(z, x.Length);
308
ответ дан 23 November 2019 в 03:15
поделиться

Для int [] то, что вы сделали, мне нравится. Ответ astander также подойдет для List .

0
ответ дан 23 November 2019 в 03:15
поделиться

Наиболее эффективной структурой с точки зрения ОЗУ (и ЦП) для хранения объединенного массива был бы специальный класс, который реализует IEnumerable (или, если хотите, даже является производным от Array) и внутренне связан с оригинальные массивы для чтения значений. AFAIK Concat делает именно это.

В вашем примере кода вы можете опустить .ToArray (), что сделает его более эффективным.

3
ответ дан 23 November 2019 в 03:15
поделиться

Вы можете сделать это так, как вы упомянули, или, если вы хотите получить действительно руководство по этому поводу, вы можете свернуть свой собственный цикл:

        string[] one = new string[] { "a", "b" };
        string[] two = new string[] { "c", "d" };
        string[] three;

        three = new string[one.Length + two.Length];

        int idx = 0;

        for (int i = 0; i < one.Length; i++)
            three[idx++] = one[i];
        for (int j = 0; j < two.Length; j++)
            three[idx++] = two[j];
2
ответ дан 23 November 2019 в 03:15
поделиться

Вы можете убрать вызов ToArray () с конца. Есть ли причина, по которой вам нужен массив после вызова Concat?

Вызов Concat создает итератор для обоих массивов. Он не создает новый массив, поэтому вы не использовали больше памяти для нового массива. Когда вы вызываете ToArray, вы фактически создаете новый массив и занимаетесь памятью для нового массива.

Так что, если вам просто нужно легко выполнить итерацию по обоим, просто вызовите Concat.

10
ответ дан 23 November 2019 в 03:15
поделиться

Попробуйте следующее:

List<int> list = new List<int>();
list.AddRange(x);
list.AddRange(y);
int[] z = list.ToArray();
79
ответ дан 23 November 2019 в 03:15
поделиться

Что вам нужно помнить, так это то, что при использовании LINQ вы используете отложенное выполнение. Все остальные описанные здесь методы работают отлично, но выполняются немедленно. Кроме того, функция Concat (), вероятно, оптимизирована способами, которые вы не можете сделать самостоятельно (вызовы внутренних API, вызовы ОС и т. Д.). В любом случае, если вам действительно не нужно пытаться оптимизировать, вы сейчас на пути к «корню всего зла»;)

1
ответ дан 23 November 2019 в 03:15
поделиться

Вы можете написать метод расширения:

public static T[] Concat<T>(this T[] x, T[] y)
{
    if (x == null) throw new ArgumentNullException("x");
    if (y == null) throw new ArgumentNullException("y");
    int oldLen = x.Length;
    Array.Resize<T>(ref x, x.Length + y.Length);
    Array.Copy(y, 0, x, oldLen, y.Length);
    return x;
}

Тогда:

int[] x = {1,2,3}, y = {4,5};
int[] z = x.Concat(y); // {1,2,3,4,5}
47
ответ дан 23 November 2019 в 03:15
поделиться
Другие вопросы по тегам:

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