C# List集合遇到的Add小问题

本文记录了一次使用C#进行开发时遇到的问题:在处理多层List集合时,直接清空内层List导致外层List中引用的同一实例也被清空。文章详细介绍了问题出现的代码片段,并提供了两种解决方案:复制再添加和重新分配新地址。

今天在进行开发的时候使用了list集合进行数据的存储,遇到一点小问题,感觉挺有意思的,就上来记录了。话不多说,先贴上代码,再说问题。

public static List<List<List<DDZHCardInfo>>> GetDragonMaxsWaitUnpack(List<List<DDZHCardInfo>> cardsGroupDatas, int dragonLen, int limitValue = 14)
        {
            ArrayEx.SortByCondition(cardsGroupDatas, (cardDataA, cardDataB) =>
            {
                return cardDataA[0].cardValueSuper - cardDataB[0].cardValueSuper < 0;
            });

            var dragonTemp = new List<List<DDZHCardInfo>>();
            //获得手牌符合限制的龙
            var dragonTabStep1 = new List<List<List<DDZHCardInfo>>>();
            for (int i = 0; i < cardsGroupDatas.Count; i++)
            {
                var cardsGroup = cardsGroupDatas[i];
                if(dragonTemp.Count == 0 || (cardsGroupDatas[i-1][0].cardValueSuper+1) == cardsGroupDatas[i][0].cardValueSuper)
                {
                    dragonTemp.Add(cardsGroup);
                }
                else
                {
                    
                    if(dragonTemp.Count >= dragonLen)
                    {
                        dragonTabStep1.Add(dragonTemp);
                    }
                    dragonTemp.Clear();
                    dragonTemp.Add(cardsGroup);
                }

                if(i == cardsGroupDatas.Count - 1 || cardsGroup[0].cardValueSuper >= limitValue)
                {
                    if(dragonTemp.Count >= dragonLen)
                    {
                        dragonTabStep1.Add(dragonTemp);
                    }
                    break;
                }
            }
            return dragonTabStep1;
        }

这个是为了获取顺子之类的组合。问题出现在下面这个代码

if(dragonTemp.Count >= dragonLen)
{
    dragonTabStep1.Add(dragonTemp);
}
dragonTemp.Clear();

当dragonTemp.Clear()之后,dragonTabStep1[0]里面的值也跟着Clear了,断点调试了几次,才发现这个Add有可能是值引用的类型,才造成了这个结果。(没去看C#的底层代码)

找到原因就好处理了,两种解决方法。

1.先Copy在添加   dragonTabStep1.Add(ArrayEx.Copy(dragonTemp));

2.添加完new新地址  dragonTemp = new List<List<DDZHCardInfo>>();

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值