将对象列表划分为子列表,而不创建其他对象

时间:2018-09-27 22:47:04

标签: c#

我试图在中断后消除编码锈,因此承担了创建简单纸牌游戏的任务。我知道我在犯一个菜鸟错误,但似乎找不到解决方法。

我正在尝试实现一些概念上的改组方法,其中一种方法是将平台清空为多个单独的堆栈,然后再次重新编译为平台。

我的deckList<T>的标准Cards。我的目标是从[0]中取出顶牌'temp_deck'并将其添加到堆/叠x中,从而将其从temp_deck的顶部移除。然后将最上面的卡片加到{/ {1}}堆,然后y,直到z没有更多的卡片。然后,我可以继续操纵这三堆并将它们添加回最后的甲板。

我的问题是,由于某种原因,它会将temp_deck中的每个card添加到每个堆中,因此每个堆temp_deck都有52张卡片。我该如何解决这个问题,以便将清单分为这些堆而不是相乘?

这是我目前(第n次)划分列表的尝试:

x, y, z

3 个答案:

答案 0 :(得分:2)

您的问题是,您要设置牌组y和z指向您一次创建的同一对象x。更改行:

    Deck y = x;
    Deck z = y;

    Deck y = new Deck();
    Deck z = new Deck();

您应该了解x,y,z是对对象的引用,当您指定y = x时,您将y指向与x指向的对象相同的事物。

答案 1 :(得分:2)

将一个对象分配给另一个对象时,并不是要创建另一个对象的副本,而是要说“让我的新对象指向与该现有对象相同的位置”。因此,您在代码中声明了4个新的牌组,但是xyz都指向相同的存储位置,而temp_deck指向相同的存储位置内存位置为deck,因此实际上总共只有2个套牌,它们之间有5个引用。

相反,如果要使用全新的对象,则必须使用new关键字(或调用一些返回新对象的方法)。

这是一个示例,可能有助于说明这一点。我们首先创建3个新卡片组,然后遍历卡片组中传递给方法的每个项目。在循环内部,我们创建了一个新的卡片组,该卡片组指向我们之前创建的三个卡片组的存储位置(由循环内部的“ i”索引值选择)。

基本上,我们采用索引(i的值),加一个(因为它从零开始),然后除以3,得到余数。如果余数为1,则使用套牌{{1 }},如果余数为2,则使用副牌x,否则(余数为0)使用副牌y

在每次迭代结束时,z平台都消失了-它只是循环中的一个临时指针。最后,我们的三个甲板上同样都装有传入的甲板上的物品:

addTo

答案 2 :(得分:-2)

您要寻找的是yield关键字

if (match condition)
 yield return element

以正确的方式构造调用(如果需要),将在不创建其他对象的情况下产生所需的结果。