我开始用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对象中,并且也不得更改课程。
答案 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)
这将创建新的列表,但是它们当然仍然引用相同的对象。因此,您可以修改一个列表,而不会修改其他列表。但是,如果您修改该列表中一个对象的属性,它也会 修改原始列表中的对象,并且所有修改的原因与您描述的原始问题相同。
通常,将引用类型的对象(除int
,bool
,double
等原始类型之外的其他对象)分配给变量不会创建该对象的副本对象,它只是将该变量设置为对该对象的引用。