列表项在对象中时会自动更新,并且不应

时间:2019-05-27 14:57:12

标签: c#

我开始用C#制作足球游戏应用程序。我应该打15个比赛日。每个比赛日都有一个数字,日期和两个带有团队的列表。在每个比赛日中,列表中具有相同索引的团队会互相对抗。 (TeamList1 [0]对战TeamList2 [0],...)。我使用for循环进行15个比赛日,并使用SwitchTeams()方法切换列表中的球队。首先,我创建一个包含两个列表的matchday-object,然后将这个matchday放在MatchDayList中,然后更改列表并创建下一个matchday对象。但是,当我以常规代码切换列表中的球队时,我的MatchDay对象中的列表也会更改。 我不知道这是怎么可能的,以及如何更改常规列表,并且MatchDay对象中的列表保持不变。有人对此有解决方案吗?谢谢

//variables
List<Team> teamList1 = new List<Team>();
List<Team> teamList2 = new List<Team>();
List<MatchDay> matchDayList = new List<MatchDay>();

//Making the 15 Matchdays
private void ComposeGamesMenuItem_Click(object sender, RoutedEventArgs e)
        {
            DateTime date = new DateTime(DateTime.Now.Year, 7, 31);
            while (date.DayOfWeek != DayOfWeek.Saturday)
            {
                date = date.AddDays(-1);
            }
            for (int i = 1; i <= 15; i++) {
                List<Team> helpList1 = teamList1;
                List<Team> helpList2 = teamList2;
                MatchDay helpMatchDay = new MatchDay(i, helpList1, helpList2, date);
                matchDayList.Add(helpMatchDay);
                SwitchTeams();
                date = date.AddDays(7);
            }        
        }

// Switching teams in original lists
 private void SwitchTeams()
        {
            teamList2.Insert(0, teamList1[1]);
            teamList1.RemoveAt(1);
            teamList1.Add(teamList2[8]);
            teamList2.RemoveAt(8);
        }

//Matchday class
public class MatchDay
    {
        private int DayNumber;
        private List<Team> TeamsList1;
        private List<Team> TeamsList2;
        private List<int> ScoresList1;
        private List<int> ScoresList2;
        private DateTime Date;

public MatchDay(int dayNumber, List<Team> teamsList1, List<Team> teamsList2, DateTime date)
        {
            DayNumber = dayNumber;
            TeamsList1 = teamsList1;
            TeamsList2 = teamsList2;
            Date = date;
        }
    }

我希望Matchday类中TeamList1和TeamList2中的列表在SwitchTeams()方法之后不会发生变化。只有作为变量的TeamList1和TeamList2才应更改并放入新的Matchday对象中,并且也不得更改课程。

1 个答案:

答案 0 :(得分:2)

因为它是相同的列表。在您的程序中,您完全有两个团队列表:

List<Team> teamList1 = new List<Team>();
List<Team> teamList2 = new List<Team>();

您再也不会创建了。当您使用它们构造MatchDay对象时:

new MatchDay(i, helpList1, helpList2, date)

该对象现在对每个列表都有一个引用。对列表所做的任何更改都将对该列表的所有引用可见。它们尚未被复制。

您可以使用扩展名.ToList()创建新列表。例如:

new MatchDay(i, helpList1.ToList(), helpList2.ToList(), date)

这将创建新的列表,但是它们当然仍然引用相同的对象。因此,您可以修改一个列表,而不会修改其他列表。但是,如果您修改该列表中一个对象的属性,它也会 修改原始列表中的对象,并且所有修改的原因与您描述的原始问题相同。

通常,将引用类型的对象(除intbooldouble等原始类型之外的其他对象)分配给变量不会创建该对象的副本对象,它只是将该变量设置为对该对象的引用。