c# - 如何同时移动两个枚举数?
问题描述
我有两个包含两个只读结构的大数组:A 和 B。我需要枚举它们,但我需要以最优化的方式进行。
readonly struct A {
long a;
long b;
long c;
long d;
long e;
long g;
}
readonly struct B {
byte a;
ushort b;
}
如您所见,类型 A 非常大struct
,无法一遍又一遍地复制它,所以我制作了自定义枚举器,它struct
通过引用 ( ref return
) 返回它。B 型不需要它,因为它的大小只有 4 个字节。现在我需要让两个枚举器同时移动,只使用一个 foreach 循环,因为直接调用枚举器的方法(即 MoveNext、Current)等等看起来并不多。
我的问题是,当我尝试将两个结构保存在一个聚合中时struct A
,会被复制并且我失去了性能增益。
public readonly struct Aggregate
{
public readonly A ItemA;
public readonly B ItemB;
public Aggregate(A itemA, in B itemB)
{
ItemA = itemA;
ItemB = itemB;
}
}
该聚合的总大小为 56 字节。当我将它分配给另一个结构的属性时,C# 复制该结构听起来很合乎逻辑。但是我能用它做什么呢?我只需要对数组元素的引用。我认为使用不安全代码获取指针不是正确的方法,因为 GC 可以移动我的数组(如果它足够小并且不在 LOH 区域中)。
那么您可以向我提出哪些解决方案?
解决方案
我不知道我是否理解你的问题是否正确,但你在谈论数组。
假设:两者都是相同大小的数组
你可以这样做
for (int i = 0; i < length; i++)
{
ref var aItem = ref arrayA[i];
ref var bItem = ref arrayB[i];
//do your stuff
}
推荐阅读
- django - DJANGO 1.11 - Can't find fixtures
- java - 如何在分布式环境中创建 64 位数字 ID
- php - PHP getElementsByTagName('*') 避免重复节点 | “在文字广告中”通过分隔内容节点
- deep-learning - Transformer - Attention is all you need - 编码器解码器交叉注意力
- javascript - 多个版本的 html2canvas
- java - 何以java(spring boot)从SAP b1获取最近添加的销售订单单据号
- python - 从包含字典列表的系列创建熊猫数据框
- ruby - 如何通过换行解析文本?
- python - ArgumentError:无法在表上创建 ForeignKeyConstraint
- java - Java 流中的中间操作