2017-06-01 12 views
2
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 

結果は私が望むものとは異なります。
ループを使用せずに変換する方法はありますか?int []をshort []に変換するには?

+1

簡単な答えは何である - intは4つのバイトを使用し、ショーツ2使用しますバイト - 基本的に代替バイトのペアをコピーする必要があります。以下の答えがうまくいきますが、メソッドのカバーの下でループを使用します。あなたの配列のサイズに応じて、あなた自身の方法でより速い解を書くことが可能かもしれません。 – PaulF

答えて

5

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; 
} 

は、実際の質問に答えるために...いや、ある時点ですべての値を変換するために、関係するループがあるでしょう。あなた自身でプログラムすることも、すでに構築されたメソッドを使用することもできます。

0

intは32ビット長であり、shortは16ビット長であるため、データをコピーする方法は正しく機能しません。

public IEnumerable<short> IntToShort(IEnumerable<int> iBuf) 
{ 
    foreach (var i in iBuf) 
    { 
     yield return (short)i; 
    } 
} 

をし、それを使用しない:

ユニバーサル方法はショートパンツにint型に変換するメソッドを作成することです

int[] iBuf = new int[2]; 
iBuf[0] = 1; 
iBuf[1] = 2; 

short[] sBuf = IntToShort(iBuf).ToArray(); 
+1

なぜ私は1つの行で行うことができる場合、追加のメソッドを作成するのが最も簡単な方法でしょうか? – Nino

+0

.NETがすでにこの機能を提供している場合、OPがメソッドを書き込む理由はありますか?Milsterの回答を参照してください。 – PaulF

+1

'iBuf.Cast ()'は既にこれを行います – Slai

関連する問題