c# Объединение двух массивов в .NET.



9 Answers

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

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

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

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 .

c# .net arrays

Есть ли встроенная функция в .NET 2.0, которая будет принимать два массива и объединить их в один массив?

Массивы одного типа. Я получаю эти массивы от широко используемой функции в моей базе кода и не могу изменить функцию для возврата данных в другом формате.

Я ищу, чтобы избежать написания моей собственной функции, чтобы сделать это, если это возможно.




Если вы не хотите удалять дубликаты, попробуйте это

Используйте LINQ:

var arr1 = new[] { 1, 2, 3, 4, 5 };
var arr2 = new[] { 6, 7, 8, 9, 0 };
var arr = arr1.Concat(arr2).ToArray();



Легче будет использовать LINQ :

var array = new string[] { "test" }.ToList();
var array1 = new string[] { "test" }.ToList();
array.AddRange(array1);
var result = array.ToArray();

Сначала преобразуйте массивы в списки и объедините их ... После этого просто преобразуйте список обратно в массив :)




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




У всех уже есть свое мнение, но я думаю, что это более читаемо, чем подход «использовать как метод расширения»:

var arr1 = new[] { 1, 2, 3, 4, 5 };
var arr2 = new[] { 6, 7, 8, 9, 0 };
var arr = Queryable.Concat(arr1, arr2).ToArray();

Однако его можно использовать только при объединении 2 массивов.




Вот простой пример использования Array.CopyTo. Я думаю, что он отвечает на ваш вопрос и дает пример использования CopyTo - я всегда озадачен, когда мне нужно использовать эту функцию, потому что помощь немного нечеткая - индекс является позицией в целевом массиве, где происходит вставка.

int[] xSrc1 = new int[3] { 0, 1, 2 };
int[] xSrc2 = new int[5] { 3, 4, 5, 6 , 7 };

int[] xAll = new int[xSrc1.Length + xSrc2.Length];
xSrc1.CopyTo(xAll, 0);
xSrc2.CopyTo(xAll, xSrc1.Length);

Наверное, вы не можете сделать это намного проще.




Мне нужно решение для объединения неизвестного количества массивов.

Удивленный никто не предоставил решение с помощью SelectMany с params .

 private static T[] Combine<T>(params IEnumerable<T>[] items) =>
                    items.SelectMany(i => i).Distinct().ToArray();

Если вы не хотите, чтобы отдельные элементы просто удалялись отдельно.

 public string[] Reds = new [] { "Red", "Crimson", "TrafficLightRed" };
 public string[] Greens = new [] { "Green", "LimeGreen" };
 public string[] Blues = new [] { "Blue", "SkyBlue", "Navy" };

 public string[] Colors = Combine(Reds, Greens, Blues);

Примечание. При использовании отдельных элементов определенно нет гарантии упорядочивания.




int [] SouceArray1 = new int[] {2,1,3};
int [] SourceArray2 = new int[] {4,5,6};
int [] targetArray = new int [SouceArray1.Length + SourceArray2.Length];
SouceArray1.CopyTo(targetArray,0);
SourceArray2.CopyTo(targetArray,SouceArray1.Length) ; 
foreach (int i in targetArray) Console.WriteLine(i + " ");  

Используя приведенный выше код, два массива могут быть легко объединены.




Созданный и расширенный метод для обработки нулевого

public static class IEnumerableExtenions
{
    public static IEnumerable<T> UnionIfNotNull<T>(this IEnumerable<T> list1, IEnumerable<T> list2)
    {
        if (list1 != null && list2 != null)
            return list1.Union(list2);
        else if (list1 != null)
            return list1;
        else if (list2 != null)
            return list2;
        else return null;
    }
}





Related


Tags

c#   .net   arrays