int[] iBuf = new int[2];
iBuf[0] = 1;
iBuf[1] = 2;
short[] sBuf = new short[2];
Buffer.BlockCopy(iBuf, 0, sBuf, 0, 2);
result
iBuf[0] = 1
sBuf[0] = 1
iBuf[1] = 2
sBuf[1] = 0
My desired result
iBuf[0] = 1
sBuf[0] = 1
iBuf[1] = 2
sBuf[1] = 2
结果与我想要的不同。
有没有办法在不使用循环的情况下进行转换?
答案 0 :(得分:6)
您可以使用Array.ConvertAll方法。
示例:
int[] iBuf = new int[2];
...
short[] sBuf = Array.ConvertAll(iBuf, input => (short) input);
此方法采用输入数组和转换器,结果将是您想要的数组。
编辑: 更短的版本是使用现有的Convert.ToInt16方法。在ConvertAll里面:
int[] iBuf = new int[5];
short[] sBuf = Array.ConvertAll(iBuf, Convert.ToInt16);
那么,ConvertAll如何工作?我们来看看实现:
public static TOutput[] ConvertAll<TInput, TOutput>(TInput[] array, Converter<TInput, TOutput> converter)
{
if (array == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.array);
}
if (converter == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.converter);
}
Contract.Ensures(Contract.Result<TOutput[]>() != null);
Contract.Ensures(Contract.Result<TOutput[]>().Length == array.Length);
Contract.EndContractBlock();
TOutput[] newArray = new TOutput[array.Length];
for (int i = 0; i < array.Length; i++)
{
newArray[i] = converter(array[i]);
}
return newArray;
}
要回答实际问题......不,在某些时候会有一个循环涉及转换所有值。您可以自己编程,也可以使用已经构建的方法。
答案 1 :(得分:0)
int长32位,短16位长,因此复制数据的方式无法正常工作。
通用的方法是创建一个将int转换为short的方法:
public IEnumerable<short> IntToShort(IEnumerable<int> iBuf)
{
foreach (var i in iBuf)
{
yield return (short)i;
}
}
然后使用它:
int[] iBuf = new int[2];
iBuf[0] = 1;
iBuf[1] = 2;
short[] sBuf = IntToShort(iBuf).ToArray();