C#中部分数组ArraySegment<T>

结构体ArraySegment<T>表示数组的一段,如果需要使用不同的方式去处理一个大型数组的不同部分,一个有效的方法是使用部分数组来代替创建多个数组。

首先来看一下构造:他是一个结构体(这里给出经常用到的部分),在 System 命名空间下,包括两个自定义构造方法,三个只读属性。

// 泛型结构体 ArraySegment<T>
public struct ArraySegment<T>
{
	// 构造方法一:根据传进来的参数初始化属性:Array = array , Offset:0 , Count:array.length
	public ArraySegment(T[] array);
	// 构造方法二:根据传进来的参数初始化属性:Array = array , Offset:offset , Count:count		
	public ArraySegment(T[] array, int offset, int count);
	// 只读属性:构造方法中传进来的数组
	public T[] Array { get; }
	// 只读属性:截取时的起始下标
	public int Offset { get; }
	// 只读属性:截取时的截取长度
	public int Count { get; }
}
C#中只读成员介绍点击打开链接

下面给出利用部分数组创建方法示例:需要特别注意的是,上面结构体的 Array 属性得到的是原数组,Count 属性代表的是截取长度。

public class ArrayTest
{
	// 参数:原数组的一部分,注意:这种情况使用 Array.Copy()方法更简便
	public static int GetSegmentSum(ArraySegment<int> SegmentArray)
	{
		int sum = 0;
		// 从起始下标开始,到最终截取的下标
		for (int i = SegmentArray.Offset; i < SegmentArray.Offset + SegmentArray.Count; i++)
		{
			// 对数组的这一部分进行操作,注意 SegmentArray.Array 获取的是原数组
			sum += SegmentArray.Array[i];
		}
		return sum;
	}
	// 参数:是已经截取好的数组(可以使用 Array.Copy()方法获取)
	public static int GetSegmentSum(int[] SegmentArray)
	{
		int sum = 0;
		// 
		for (int i = 0; i < SegmentArray.Length; i++)
		{
			sum += SegmentArray[i];
		}
		return sum;
	}
	// 参数:原数组的几个部分组成的数组,这种情况使用部分数组很简便,不用创建多个方法和多个数组
	public static int GetSegmentSum(ArraySegment<int>[] SegmentArray)
	{
		int sum = 0;
		for (int i = 0; i < SegmentArray.Length; i++)
		{ 	
			for(int j = SegmentArray[i].Offset;j < SegmentArray[i].Offset + SegmentArray[i].Count;j++)
			{
				// 这里只是给出一个简单的处理,是为了表明可以很方便的处理一个数组的不同部分
				if(i == 0)
				{
					sum += SegmentArray[i].Array[j];
				}
				else
				{
					sum -= SegmentArray[i].Array[j];					
				}
			}
		}
		return sum;
	}
}
下面给出调用示例: 注意,当需要用到的部分数据较少时,使用Array.Copy( ) 方法更简单。

int[] aa = { 1,2,3,4,5,6,7,8,9};
// 1.创建部分数组,从aa 数组的下标 5 开始,长度是 4
ArraySegment<int> bb = new ArraySegment<int>(aa,5,4);

// 2.创建复制复制数组 bb1,长度是 4
int[] bb1 = new int[4];
// 从 aa 数组下标 5 开始复制,到bb数组下标 0 开始,复制长度是 4,最终 bb = {6,7,8,9}
Array.Copy(aa,5,bb1,0,4);

// 3.创建多个部分数组
ArraySegment<int>[] bb2 =
{
	new ArraySegment<int>(aa,0,4),
	new ArraySegment<int>(aa,5,4)
};
	
// 调用方法测试
int  sum = ArrayTest.GetSegmentSum(bb); // 6+7+8+9 = 30
int  sum1 = ArrayTest.GetSegmentSum(bb1); // 6+7+8+9 = 30
int  sum2 = ArrayTest.GetSegmentSum(bb2); // 1+2+3+4-(6+7+8+9) = -20

C#中复制数组及其方法介绍点击打开链接


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用C#的WebSocket类库来调用WebSocket,以下是一个简单的示例代码: ```csharp using System; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; namespace WebSocketDemo { class Program { static async Task Main(string[] args) { using (var client = new ClientWebSocket()) { Uri serverUri = new Uri("wss://echo.websocket.org"); await client.ConnectAsync(serverUri, CancellationToken.None); Console.WriteLine("WebSocket connected!"); while (client.State == WebSocketState.Open) { Console.Write("Enter message: "); string message = Console.ReadLine(); ArraySegment<byte> messageBuffer = new ArraySegment<byte>(System.Text.Encoding.UTF8.GetBytes(message)); await client.SendAsync(messageBuffer, WebSocketMessageType.Text, true, CancellationToken.None); byte[] receiveBuffer = new byte[1024]; ArraySegment<byte> receiveSegment = new ArraySegment<byte>(receiveBuffer); WebSocketReceiveResult receiveResult = await client.ReceiveAsync(receiveSegment, CancellationToken.None); string receiveMessage = System.Text.Encoding.UTF8.GetString(receiveSegment.Array, 0, receiveResult.Count); Console.WriteLine($"Received message: {receiveMessage}"); } } } } } ``` 在本示例,我们使用了`ClientWebSocket`类来创建一个WebSocket客户端,并使用`ConnectAsync`方法连接到指定的WebSocket服务器。然后,我们可以使用`SendAsync`方法发送消息,使用`ReceiveAsync`方法接收消息。这个示例连接到了Echo WebSocket服务器,你可以修改服务器地址为你需要连接的WebSocket服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值