我为玩家和团队分别设置了课程。我想返回一个列表(玩家)到与他们的相同teamid匹配的所有玩家的Team类。我已经设法通过Player类(找到与该玩家的teamid匹配的一个单独的团队)来做到这一点,但是当尝试使用Team类中的列表进行此操作时,会出现无限循环错误。
我将向您展示我尝试使用的代码,但是必须有一种更简单的方法来执行此操作。我认为发生这种情况的原因是因为玩家是在加载文件后生成的,但是在打开游戏时就创建了团队(我仍在进行大量测试,因此在打开游戏而不是在打开时就生成了团队一个按钮,就像播放器生成一样。)
我还认为无限循环的发生是因为在Team.cs中调用了Form1。我只是不知道该怎么做,因此不胜感激!
所以在Player.cs上,我有以下代码(效果很好):
Form1 f1 = new Form1();
public Team Team
{
get
{
return f1.getTeams.Find(x => x.teamid == teamid);
}
}
由于Form1在创建玩家时已经实例化(当前在程序上单击按钮,但稍后将在创建联赛而不是按钮上进行实例化),因此上述代码有效。
如果你们可以在不使用Form1的情况下帮助我找到一种方法,那也很好。但是目前的主要问题是下面的代码创建了一个无限循环。
在Team.cs上,我有以下代码,但不起作用:
Form1 f1 = new Form1();
//THIS IS CREATING AN INFINITE LOOP... THERE HAS TO BE ANOTHER WAY TO FIND THE PLAYERS WITH THE SAME TEAMID???
public List<Player> Players
{
get
{
Player player = f1.getPlayers.Find(
delegate (Player p) { return p.teamid == teamid; });
foreach (Player p in players)
{
Players.Add(p);
}
return Players;
}
}
这是getPlayers的内部内容:
public List<Player> getPlayers
{
get
{
return listOfPlayers;
}
set
{
listOfPlayers = value;
}
}
答案 0 :(得分:4)
您将需要您的吸气剂来创建自己的列表并返回该列表。照原样,您是从Players
getter的内部引用Players
的,因此由于无限递归,您会得到堆栈溢出。
修复:
using System.Linq;
// ...
public IList<Player> Players
{
get
{
// Assuming that `.Find(...)` returns an `IEnumerable<Player>`
return f1.getPlayers.Find(p => p.teamid == teamid).ToList()
}
}
(如果f1.getPlayers.Find(...)
未创建IEnumerable,则可以保留循环模式):
public IList<Player> Players
{
get
{
var result = new List<Player>();
foreach (var player in f1.getPlayers.Find(p => p.teamid == teamid))
{
result.Add(player);
}
return result;
}
}
更新:
因为我们现在可以看到f1.getPlayers
返回一个List<Player>
,所以这更合适(Where
过滤列表,而不是Find
仅返回一个匹配项) :
public IList<Player> Players
{
get
{
return f1.getPlayers.Where(p => p.teamid == teamid).ToList()
}
}