【问题标题】:c# List<> item is being overwritten by the next itemc# List<> item 被下一个 item 覆盖
【发布时间】:2015-02-26 18:46:13
【问题描述】:

我有以下代码:

//for each player, calculate his position rating
for (int i = 0; i < viewModel.PlayerList.Count; i++)
{
    var player = viewModel.PlayerList[i];

    var positionList = new List<Position>();
    for (int j = 0; j < viewModel.PositionsStatic.Count; j++)
    {
        var position = viewModel.PositionsStatic[j];
        var positionPlayerRating = 0;

        for (int k = 0; k < player.AttributesList.Count; k++)
        {
            var attrib = player.AttributesList[k];
            try
            {
                var selectedAttrib = 
                    position.AttribsByPosition.FirstOrDefault(x => x.AttributeId == attrib.AttributeId);
                if (selectedAttrib != null)
                {
                    positionPlayerRating = positionPlayerRating + selectedAttrib.AttributePlayerPosMult * Convert.ToInt32(attrib.AttributeValue);
                }
            }
            catch (Exception exception)
            {
                string exc = exception.Message;
                throw;
            }
        }

        position.PositionPlayerRating = positionPlayerRating;
        positionList.Add(position);
    }

    player.PositionList = new List<Position>(positionList);

    playerList.Add(player);
}

问题是在 playerList 中,每个玩家的 PositionList 总是相同的。正在发生的事情是它正在获取下一个 PositionList 并覆盖前一个,因此有效地我拥有最后一个 positionList 的所有玩家,而不是不同的 positionLists。

我尝试了所有我能想到的方法,但没有运气。

【问题讨论】:

  • 请展示一个简短但完整的程序来说明问题。我的猜测是您的 playerList 只是对同一个 Player 对象有多个引用,但我们无法从您向我们展示的内容中真正分辨出来。
  • 当您只需要对集合中的每个项目执行操作而不需要知道集合中的位置时,请考虑使用foreach 而不是for。这将使您的代码更具可读性。
  • 在不相关的注释中,catch 块是无用的,因此应该删除 try/catch 结构。

标签: c# asp.net asp.net-mvc list


【解决方案1】:

您正在为每个玩家执行相同的位置循环。该位置不会被最后一个覆盖,而是为每个位置选择最后一个。

检查你的逻辑。

【讨论】:

    【解决方案2】:

    当您从视图模型中获取每个位置时,列表中相同的 position 对象每次都会被拉到每个玩家的位置。

    因此,假设玩家 A 和 viewModel.PositionsStatic[0] 您分配 PositionPlayerRating 并将其添加到位置列表中。如果相同的对象,即viewModel.PositionsStatic[0] 被拉起并为玩家 B 修改,它将覆盖玩家 A 的评级。

    【讨论】:

    • 好的,我将不得不改变我的逻辑并为每个玩家传递一个新的 PositionList
    • 我希望先克隆 position 对象,然后将其保存到 positionList
    • 您创建了一个新对象(克隆)。您可以修改克隆的对象,而不会在原始对象中反映任何更改,反之亦然。请参阅documentation
    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多