ASP技巧(2)

在读取流的时候常常需要进行组合数组的操作

比较有效率的可以使用Buffer类的BlockCopy来拼合两个数组

方法体【详细可以参考MSDN】
public static void BlockCopy (
Array src,
int srcOffset,
Array dst,
int dstOffset,
int count
)

注意:这里只能使用值数组,如果使用对象数组会报ArgumentException

注意:srcOffset和dstOffset不是数组索引,是数组偏移量
比如5,不代表数组的第6个元素,而是代表偏移5个字节位置

参照MSDN上的例子
开发人员应谨记 BlockCopy 方法使用偏移量访问 src 参数,而不是使用索引或数组上下限等编程构造。例如,如果使用应用程序的编程语言声明一个上限为零,下限为 -50 的 Int32 数组,然后将该数组和偏移量 5 传递给 BlockCopy 方法,则该方法将访问的第一个数组元素是该数组的第二个元素(位于索引 -49 处)。此外,首先访问数组元素 -49 的哪个字节取决于执行应用程序的计算机的 Edian 设置。

因为Int32数组每个元素占4个字节,这里数组便宜是5也就是从第二个元素开始了

下面举一个例子

 

         static   void  Main( string [] args)
        
{
            
byte[] b1 = 12,24,1};
            
byte[] b2 = {1,2,3,4,12 };

            Display(b1, 
"b1");
            Display(b2, 
"b2");
            
try
            
{
                Buffer.BlockCopy(b1, 
0, b2, 0, Buffer.ByteLength(b1));
            }

            
catch (ArgumentException)
            
{
                Console.WriteLine(
"error!");
            }


            Display(b2, 
"new b2");



            b2 
= ComBineArray<byte>(b2, b1);

            Display(b2, 
"new2 b2");

            
byte[] b3 = 556677 };

            b2 
= ComBineArray<byte>(b2, b3);

            Display(b2, 
"new3 b2");

            Console.ReadLine();
        }


        
private   static   void  Display(Array arr, string  name)
        
{
            Console.Write(
"{0,5}:", name);
            
for (int loopX = 0; loopX <arr.Length; loopX++)
            
{
                Console.Write(arr.GetValue(loopX)
+" ");
            }

            Console.WriteLine();

        }


        
private   static  T[] ComBineArray < T > (T[] a1, T[] a2)
        
{
            T[] result 
= new T[a1.Length + a2.Length];
            
int a1Len = Buffer.ByteLength(a1);
            
int a2Len = Buffer.ByteLength(a2);

            Buffer.BlockCopy(a1, 
0, result, 0, a1Len);
            Buffer.BlockCopy(a2, 
0, result, a1Len, a2Len);
            
return result;
        }



 

运行一下看看各个阶段的输出结果应该就清楚了 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值