.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.
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)
小智 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)
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)
首先将数组转换为列表并合并它们...之后只需将列表转换回数组:)
每个人都已经发表了意见,但我认为这比“用作扩展方法”方法更具可读性:
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)
从 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的一部分。