如何将int []转换为short []?

时间:2017-06-01 09:06:20

标签: c# arrays type-conversion

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  

结果与我想要的不同。
有没有办法在不使用循环的情况下进行转换?

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();