【问题标题】:How to create a sublist that I can edit and update back to the original list如何创建可以编辑并更新回原始列表的子列表
【发布时间】:2012-07-30 17:14:45
【问题描述】:

我正在为一个玩扑克的程序编写代码。我的问题是关于列表中的引用和值传递。

我的程序有一个 Player 对象、一个 Dealer 对象和一个 PokerTable 对象。 PokerTable 有两个玩家列表,一个称为玩家,一个称为获胜者。玩家列表被传递给 Dealer 对象的DetermineWinner 方法,该方法传回包含获胜者(或在平局情况下为获胜者)的列表。 PokerTable 然后使用获胜者列表来确定向谁付款。

    class PokerTable
    {
        private Dealer dealer;
        private List<Player> players;
        private List<Player> winners;            

        private void EndHand()
        {
            winners = dealer.DetermineWinner(players);
            PayPlayers();
            winners.Clear();
            PrepareForNextHand();
        }

        private void PayPlayers()
        {
           /* code here uses the winners list to determine
            * how much to pay each winner and adds that money
            * to the player object */
        }

我的问题是,向获胜者列表中的玩家对象添加金钱是否也会影响原始玩家列表中的原始玩家对象。

【问题讨论】:

  • 您应该能够轻松地做到这一点,看看会发生什么。
  • 你自己在调试器中测试过吗?通常,列表的内容是对每个列表项的实例的引用。
  • 我自己试过了,然后就成功了。谢谢!

标签: c# list reference parameter-passing


【解决方案1】:

List&lt;Player&gt; 是对Player 对象的引用列表。

如果两个单独列表中的引用指向同一个 Player,那么更新一个列表中的 Player 似乎也会更改另一个列表中的 Player。

class Player
{
     internal int Money;
}

// ...

    Player player = new Player{ Money = 700 };
    List<Player> list1 = new List<Player>{player};
    List<Player> list2 = new List<Player>{player};

    list1[0].Money = 400;

    Assert.AreEqual(400, list2[0].Money); // Assertion passes.

另一方面,如果您的列表指向一个值类型,那么更改当然不会反映:

var money = 700;
var list1 = new List<int>{money};
var list2 = new List<int>{money};

list1[0] = 400;

Assert.AreNotEqual(400, list2[0]); // Assertion passes.

【讨论】:

  • 正确,前提是 Player 确实是一个类而不是一个结构
  • Player 是一个类而不是一个结构。感谢您的帮助,代码运行良好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 2020-10-18
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多