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

被折叠的 条评论
为什么被折叠?



