在.NET中合并两个数组

kbr*_*ley 211 .net c# arrays

.NET 2.0中是否有内置函数,它将采用两个数组并将它们合并为一个数组?

这些数组都是相同的类型.我从我的代码库中广泛使用的函数中获取这些数组,并且无法修改函数以返回不同格式的数据.

我希望尽可能避免编写自己的功能来实现这一目标.

Owe*_*enP 422

在C#3.0中,您可以使用LINQ的Concat方法轻松完成此任务:

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

在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);
Run Code Online (Sandbox Code Playgroud)

这可以很容易地用于实现您自己的版本Concat.

  • 我喜欢 LINQ 实现。我真的需要尽快跳入 LINQ... (3认同)

Bla*_*rad 111

如果您可以操作其中一个阵列,则可以在执行复制之前调整其大小:

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);
Run Code Online (Sandbox Code Playgroud)

否则,您可以创建一个新数组

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);
Run Code Online (Sandbox Code Playgroud)

有关MSDN上可用的数组方法的更多信息.

  • 请注意,`Array.Resize`实际上并没有调整数组的大小,而是复制它.这就是为什么第一个参数是by-ref(这意味着你的第一个代码可能无法编译). (3认同)
  • 请注意,Array.Copy的第二个代码示例中的参数顺序是错误的.使用Array.Copy(array1,newArray,0); 代替. (3认同)
  • 我只是抛弃你的第一段代码.它没有提供优势,并且更难以阅读IMO. (2认同)

小智 68

使用LINQ:

var arr1 = new[] { 1, 2, 3, 4, 5 };
var arr2 = new[] { 6, 7, 8, 9, 0 };
var arr = arr1.Union(arr2).ToArray();
Run Code Online (Sandbox Code Playgroud)

  • 注意:Union将删除重复项. (121认同)
  • 因为它将删除重复,它永远不会是一个正确的答案. (7认同)

Smi*_*ith 35

如果您不想删除重复项,请尝试此操作

使用LINQ:

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


小智 10

首先,确保你问自己"我真的应该在这里使用数组"这个问题吗?

除非你正在构建一个速度至关重要的东西,否则一个类型化的列表就好像List<int>是要走的路.我通过网络发送内容时,唯一使用数组的是字节数组.除此之外,我从不接触它们.


小智 9

更容易使用LINQ:

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

首先将数组转换为列表并合并它们...之后只需将列表转换回数组:)


GEO*_*HET 7

我认为你可以使用Array.Copy.它需要一个源索引和目标索引,因此您应该能够将一个数组附加到另​​一个数组.如果你需要更复杂而不仅仅是将一个附加到另一个,这可能不适合你.


Joe*_*orn 5

假设目标阵列有足够的空间,Array.Copy()将起作用.您也可以尝试使用a List<T>及其.AddRange()方法.


Joh*_*lly 5

每个人都已经发表了意见,但我认为这比“用作扩展方法”方法更具可读性:

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

但是,它只能在将 2 个数组放在一起时使用。


小智 5

这就是我想出的。适用于可变数量的数组。

public static T[] ConcatArrays<T>(params T[][] args)
    {
        if (args == null)
            throw new ArgumentNullException();

        var offset = 0;
        var newLength = args.Sum(arr => arr.Length); 
        var newArray = new T[newLength];

        foreach (var arr in args)
        {
            Buffer.BlockCopy(arr, 0, newArray, offset, arr.Length);
            offset += arr.Length;
        }

        return newArray;
    }
Run Code Online (Sandbox Code Playgroud)

...

var header = new byte[] { 0, 1, 2};
var data = new byte[] { 3, 4, 5, 6 };
var checksum = new byte[] {7, 0};
var newArray = ConcatArrays(header, data, checksum);
//output byte[9] { 0, 1, 2, 3, 4, 5, 6, 7, 0 }
Run Code Online (Sandbox Code Playgroud)


Ole*_*hov 5

从 C# 12 开始,您可以使用集合表达式扩展运算符 ..,例如:

int[] a = [1, 2, 3];
int[] b = [4, 5, 6];
int[] c = [..a, ..b];
Run Code Online (Sandbox Code Playgroud)

注意:该功能是2023 年 11 月发布的.NET 8的一部分。