如何在不创建无限循环的情况下从另一个类返回列表?

时间:2018-07-05 19:28:09

标签: c#

我为玩家和团队分别设置了课程。我想返回一个列表(玩家)到与他们的相同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;
        }
    }

1 个答案:

答案 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()
    }
}