Array conversion, or reshaping of objects, seems like a cool thing to do with LINQ and C# 3.0.
I've played around a little with the following:
sbyte[] imageBytes = GetImage();
// convert using extension method / Lambda syntax
byte[] y = imageBytes.Select( s => (byte) s ).ToArray();
// convert using LINQ syntax
byte[] x = ( from b in imageBytes select (byte) b).ToArray() ;
// convert using the Cast extension method
byte[] z = imageBytes.Cast<byte>().ToArray();
So what is the difference? Actually approach 1 and 2 lead to the same IL.
The Cast method works quite different and in my case I got an exception from approach 3 saying the sbyte would not fit in the byte.
But of course LINQ is not needed for this simple conversion:
// convert by casting to array to byte[]
byte[] bytes = (byte[])(Array)imageBytes;
I did a quick perf check and the last option is 500 to 800 times faster.