(13)C#里使用比较难理解的IList<ArraySegment<byte>>类型

在网络开发中,由于TCP数据分段接收,常常使用IList<ArraySegment<byte>>来存储和合并数据。ArraySegment<byte>作为数据段容器,List则用于收集所有分段。本文探讨了如何理解和操作这种数据结构,包括将其转换为byte[]数组以及如何添加数据。


经常做网络开发,需要接收网络的数据,由于TCP的数据是一段一段地接收到的,那么需要把这些数据放到缓冲区,然后又需要把这些数据合并起来使用。
因此就会使用IList<ArraySegment<byte>>类型,使用ArraySegment<byte>来保存收到的一段数据,然后使用List来保存所有分段的数据。

初学C#的人,使用这个类型,往往比较难理解,所以需要通过例子来练习它。
比如怎么样从IList<ArraySegment<byte>>类型转换为byte[]数组,又或者怎么样往里面添加数据。

先来看一下ArraySegment<T>的定义:

#region 程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll
#endregion

using System.Collections;
using System.Collections.Generic;

namespace System
{
    //
    // 摘要:
    //     分隔一维数组的一部分。
    //
    // 类型参数:
    //   T:
    //     数组段中元素的类型。
    public struct ArraySegment<T> : ILis
C# 中,`IList<IList<int>>` 表示一个列表,列表中的每个元素又是一个整数列表。以下是几种不同场景下返回值类型为 `IList<IList<int>>` 的代码示例及使用方法。 ### 示例 1:返回嵌套列表的简单方法 ```csharp using System; using System.Collections.Generic; class Program { static IList<IList<int>> GetNestedLists() { IList<IList<int>> result = new List<IList<int>>(); // 创建第一个内部列表 IList<int> list1 = new List<int> { 1, 2, 3 }; result.Add(list1); // 创建第二个内部列表 IList<int> list2 = new List<int> { 4, 5, 6 }; result.Add(list2); return result; } static void Main() { IList<IList<int>> nestedLists = GetNestedLists(); // 遍历并输出每个内部列表的元素 foreach (var innerList in nestedLists) { foreach (var number in innerList) { Console.Write(number + " "); } Console.WriteLine(); } } } ``` 在这个示例中,`GetNestedLists` 方法创建了一个包含两个内部整数列表的 `IList<IList<int>>` 对象,并将其返回。在 `Main` 方法中,调用 `GetNestedLists` 方法获取嵌套列表,并使用嵌套的 `foreach` 循环遍历并输出每个内部列表的元素。 ### 示例 2:生成二维数组形式的嵌套列表 ```csharp using System; using System.Collections.Generic; class Program { static IList<IList<int>> GenerateNestedLists(int rows, int cols) { IList<IList<int>> result = new List<IList<int>>(); for (int i = 0; i < rows; i++) { IList<int> innerList = new List<int>(); for (int j = 0; j < cols; j++) { innerList.Add(i * cols + j); } result.Add(innerList); } return result; } static void Main() { int rows = 3; int cols = 4; IList<IList<int>> nestedLists = GenerateNestedLists(rows, cols); // 遍历并输出每个内部列表的元素 foreach (var innerList in nestedLists) { foreach (var number in innerList) { Console.Write(number + " "); } Console.WriteLine(); } } } ``` 此示例中,`GenerateNestedLists` 方法根据传入的行数和列数生成一个二维数组形式的嵌套列表。在 `Main` 方法中,调用该方法生成嵌套列表,并使用嵌套的 `foreach` 循环输出每个内部列表的元素。 ### 使用方法总结 - **调用方法获取嵌套列表**:通过调用返回 `IList<IList<int>>` 类型的方法,如上述示例中的 `GetNestedLists` 或 `GenerateNestedLists` 方法,获取嵌套列表对象。 - **遍历嵌套列表**:使用嵌套的 `foreach` 循环遍历嵌套列表,外层循环遍历每个内部列表,内层循环遍历内部列表中的每个整数元素。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值