为了账号安全,请及时绑定邮箱和手机立即绑定

如何同时移动两个枚举数?

如何同时移动两个枚举数?

C#
慕姐4208626 2022-06-18 17:40:35
我有两个包含两个只读结构的大数组: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 区域中)。那么您可以向我提出哪些解决方案?
查看完整描述

2 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

我不知道我是否理解你的问题是否正确,但你在谈论数组。


假设:两者都是相同大小的数组


你可以这样做


for (int i = 0; i < length; i++)

{

    ref var aItem = ref arrayA[i];

    ref var bItem = ref arrayB[i];

    //do your stuff

}


查看完整回答
反对 回复 2022-06-18
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

您可以显式使用枚举器,而无需 foreach 循环:


var aEnumerator = listA.GetEnumerator();

var bEnumerator = listB.GetEnumerator();

while (aEnumerator.MoveNext() && bEnumerator.MoveNext()) {

    var aItem = aEnumerator.Current;

    var bItem = bEnumerator.Current;

    //TODO: do some work

}


查看完整回答
反对 回复 2022-06-18
  • 2 回答
  • 0 关注
  • 126 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信