Вы не могли бы хотеть, но Ваш лучший выбор состоит в том, чтобы захватить sunfreeware CD и установить lsof.
Кроме этого, да можно унизиться вокруг в/proc со сценарием оболочки.
var z = new int[x.Length + y.Length];
x.CopyTo(z, 0);
y.CopyTo(z, x.Length);
Для int [] то, что вы сделали, мне нравится. Ответ astander также подойдет для List
.
Наиболее эффективной структурой с точки зрения ОЗУ (и ЦП) для хранения объединенного массива был бы специальный класс, который реализует IEnumerable (или, если хотите, даже является производным от Array) и внутренне связан с оригинальные массивы для чтения значений. AFAIK Concat делает именно это.
В вашем примере кода вы можете опустить .ToArray (), что сделает его более эффективным.
Вы можете сделать это так, как вы упомянули, или, если вы хотите получить действительно руководство по этому поводу, вы можете свернуть свой собственный цикл:
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];
Вы можете убрать вызов ToArray () с конца. Есть ли причина, по которой вам нужен массив после вызова Concat?
Вызов Concat создает итератор для обоих массивов. Он не создает новый массив, поэтому вы не использовали больше памяти для нового массива. Когда вы вызываете ToArray, вы фактически создаете новый массив и занимаетесь памятью для нового массива.
Так что, если вам просто нужно легко выполнить итерацию по обоим, просто вызовите Concat.
Попробуйте следующее:
List<int> list = new List<int>();
list.AddRange(x);
list.AddRange(y);
int[] z = list.ToArray();
Что вам нужно помнить, так это то, что при использовании LINQ вы используете отложенное выполнение. Все остальные описанные здесь методы работают отлично, но выполняются немедленно. Кроме того, функция Concat (), вероятно, оптимизирована способами, которые вы не можете сделать самостоятельно (вызовы внутренних API, вызовы ОС и т. Д.). В любом случае, если вам действительно не нужно пытаться оптимизировать, вы сейчас на пути к «корню всего зла»;)
Вы можете написать метод расширения:
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}