gpt4 book ai didi

c# - 是否可以将 IList> 转换为 byte[] 而无需枚举列表并添加到新的 byte[]?

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:10 27 4
gpt4 key购买 nike

我知道我可以通过 IList 进行枚举,例如:

public byte[] ConvertToByteArray(IList<ArraySegment<byte>> list) {
IList<byte> newList = new List<byte>();
foreach(var asb in list) {
for ( int i = asb.Offset; i < (asb.Offset + asb .Count); i++ ) {
newList.Add(asb.Array[i]);
}
}
return newList.ToArray();
}

但这看起来很丑陋,有更好的方法吗?

最佳答案

这可能是一个潜在的棘手问题,因为 ArraySegment 实际上只是原始数组的 View 包装器,并且对围绕其创建的 ArraySegment 的数量没有限制一个数组(作为引用而不是副本存储在 ArraySegment.Array 属性中)- 因此您不能通过一次性提取数组来做任何技巧。

也就是说,您的初始代码可以稍微改进一下。缓冲副本。这假定您希望在结果数组中复制指向基础数组中相同值的段中的值。

public byte[] ConvertToByteArray(IList<ArraySegment<byte>> list)
{
var bytes = new byte[list.Sum (asb => asb.Count)];
int pos = 0;

foreach (var asb in list) {
Buffer.BlockCopy (asb.Array, asb.Offset, bytes, pos, asb.Count);
pos += asb.Count;
}

return bytes;
}

这确实迭代了 list 两次(为了获得总数,但对于更大的 ArraySegments,在我的综合测试中,缓冲复制是一个更大的胜利,而不是额外的迭代是一个损失)。一如既往,衡量它是否是性能关键代码路径。

关于c# - 是否可以将 IList<ArraySegment<byte>> 转换为 byte[] 而无需枚举列表并添加到新的 byte[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5062233/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com