Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何跨多个调用在C#中遍历数组_C#_.net_C# 4.0 - Fatal编程技术网

如何跨多个调用在C#中遍历数组

如何跨多个调用在C#中遍历数组,c#,.net,c#-4.0,C#,.net,C# 4.0,我们有一个应用程序,需要将一个流中的一些数据反序列化为多个对象 数据数组表示打包在一起的许多可变长度的消息。流中没有消息定界代码 我们想做一些类似的事情: void Decode(byte[] Data) { Object0.ExtractMessage(Data); Object1.ExtractMessage(Data); Object2.ExtractMessage(Data); ... } 每个ProcessData调用都知道在数组中从何处开

我们有一个应用程序,需要将一个流中的一些数据反序列化为多个对象

数据数组表示打包在一起的许多可变长度的消息。流中没有消息定界代码

我们想做一些类似的事情:

void Decode(byte[] Data)  
{  
    Object0.ExtractMessage(Data);
    Object1.ExtractMessage(Data);
    Object2.ExtractMessage(Data);
    ...
}  
每个ProcessData调用都知道在数组中从何处开始。理想情况下,我们可以在不传入
DataIx
引用的情况下执行此操作

在C++中这样做,我们只需将指针交给数组,每个PATABATE数据函数将按需要递增。 每个对象类都知道自己的消息是如何序列化的,并且可以依赖(在C++中)在流中下一条消息的开头返回指针

我们是否可以使用某种内置机制来实现这一点(而不必使用
不安全的
)?操作频率高(~10kps),重量轻。我们也不想复制或修剪阵列


谢谢你的帮助。

你能不能先传入并返回数组索引?这基本上就是指针的全部,它是一个相对于固定内存位置的偏移量

您能不能传入并返回数组索引?这基本上就是指针的全部,它是一个相对于固定内存位置的偏移量

将数据包装在MemoryStream中,然后将StreamReader传递到ExtractMessage方法中如何?

将数据包装在MemoryStream中,然后将StreamReader传递到ExtractMessage方法中如何?

我想我想到了几件事

您可以通过将字节[]包装到一个同样维护数组偏移量的类中来模拟指针的操作。每当您访问数组时,您都会通过类来访问它,可能是通过一个访问器方法,该方法返回下一个字节并增加偏移量变量。类实例可以在不同的ExtractMessage函数调用之间传递

使用C++/CLI如何?这将允许您使用熟悉的C/C++技术,并且可以直接从C#调用,而无需可怕的互操作


当然还有一个可怕的不安全选项,即获取指向字节[]的C#指针并执行所需的指针算法。

我想我想到了几件事

您可以通过将字节[]包装到一个同样维护数组偏移量的类中来模拟指针的操作。每当您访问数组时,您都会通过类来访问它,可能是通过一个访问器方法,该方法返回下一个字节并增加偏移量变量。类实例可以在不同的ExtractMessage函数调用之间传递

使用C++/CLI如何?这将允许您使用熟悉的C/C++技术,并且可以直接从C#调用,而无需可怕的互操作


当然还有一个可怕的不安全选项,即获取指向字节[]的C#指针并执行所需的指针算法。

这听起来像是想要一个简单的流(例如,只需使用MemoryStream作为字节数组的包装:
流=新的MemoryStream(数据)).
只需将字节数组包装成一个流,每个对象从流中读取所需的内容,然后将流交给下一个项目。它甚至还有一个好处,即您不必一次加载整个字节数组

<>除了可以在C++中使用指针,就像C++中的指针(尽管指针需要不安全的关键字,并且它们被劝阻)


或者,您可以只传递数据和索引变量,然后增加索引(实际上,这与使用指针相同,但不需要不安全)。

这听起来像是您想要一个简单的流(例如,只需使用MemoryStream作为字节数组的包装:
流=新的MemoryStream(数据)).
只需将字节数组包装成一个流,每个对象从流中读取所需的内容,然后将流交给下一个项目。它甚至还有一个好处,即您不必一次加载整个字节数组

<>除了可以在C++中使用指针,就像C++中的指针(尽管指针需要不安全的关键字,并且它们被劝阻)


或者,您可以只传递数据和索引变量,然后增加索引(实际上,这与使用指针相同,但不需要不安全)。

您可以从字节数组创建

Stream stream = new MemoryStream(data);

然后你的处理器可以在流上工作

您可以从字节数组创建

Stream stream = new MemoryStream(data);

然后你的处理器可以在流上工作

我知道你说过你不想使用索引,但我过去的做法是传入一个开始索引并返回下一个要继续使用的索引。我可以,如果没有其他方法,我会,因为我们过去也是这样做的。我只是想知道是否有更简洁的方法?我知道你说过你不想使用索引,但我过去的做法是传入一个开始索引,然后返回下一个索引继续。我可以,如果没有其他方法,我会,因为我们过去也是这样做的。只是想知道是否有更整洁的方法?我喜欢流的想法-目标是保持消息系统的C和C部分看起来和工作尽可能相似。我喜欢流的想法-目标是保持消息系统的C和C部分看起来和工作尽可能相似。