Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从另一个类返回列表而不创建无限循环?_C# - Fatal编程技术网

C# 如何从另一个类返回列表而不创建无限循环?

C# 如何从另一个类返回列表而不创建无限循环?,c#,C#,我为球员和球队分别上课。我想将一个列表(玩家)返回给Team类,其中包含所有匹配同一teamid的玩家。我已经设法在Player类中实现了这一点(找到了一个与Player的teamid匹配的单独团队),但是当尝试在team类中的列表中实现这一点时,我得到了一个无限循环错误 我会给你们看我试图使用的代码,但必须有一个更简单的方法来做到这一点。我认为发生这种情况的原因是,玩家是在加载文件后生成的,但团队是在打开游戏时创建的(我仍在进行大量测试,因此团队是在打开游戏时生成的,而不是像生成玩家那样单击按

我为球员和球队分别上课。我想将一个列表(玩家)返回给Team类,其中包含所有匹配同一teamid的玩家。我已经设法在Player类中实现了这一点(找到了一个与Player的teamid匹配的单独团队),但是当尝试在team类中的列表中实现这一点时,我得到了一个无限循环错误

我会给你们看我试图使用的代码,但必须有一个更简单的方法来做到这一点。我认为发生这种情况的原因是,玩家是在加载文件后生成的,但团队是在打开游戏时创建的(我仍在进行大量测试,因此团队是在打开游戏时生成的,而不是像生成玩家那样单击按钮)

我还认为发生无限循环是因为Form1在Team.cs中被调用。。我只是不知道怎么做,所以任何帮助都是感激的

因此,在Player.cs上,我有以下代码(非常有效):

由于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;
        }
    }
form1f1=newform1();
//这是在创建一个无限循环。。。必须有另一种方法找到具有相同TEAMID的球员???
公开球员名单
{
收到
{
Player=f1.getPlayers.Find(
代表(玩家p){return p.teamid==teamid;});
foreach(玩家中的玩家p)
{
玩家。添加(p);
}
返回球员;
}
}
这就是GetPlayer的内部功能:

public List<Player> getPlayers
    {
        get
        {
            return listOfPlayers;
        }
        set
        {
            listOfPlayers = value;
        }
    }
public-List-getPlayers
{
收到
{
返回层列表;
}
设置
{
ListOfLayers=值;
}
}

您需要getter创建自己的列表并返回该列表。实际上,您正在从
Players
getter内部引用
Players
,因此,由于无限递归,您将得到堆栈溢出

修正:

更新

因为我们现在可以看到
f1.getPlayers
返回一个
列表
,所以这更合适(
Where
过滤列表,而
Find
只返回一个匹配项):

公共IList播放器
{
收到
{
返回f1.getPlayers.Where(p=>p.teamid==teamid).ToList()
}
}

players指的是什么?
players中的Player p
只需返回
players
可能,但您的代码不完整。嗯,请后退一步,尝试重新设计您的模型。你是对的。如果您的模型设计得当,可能会有更好的方法。玩家是Team.cs上的列表。我希望通过找到与他们的团队ID相匹配的玩家来创建这个列表。试着发布一个MCVE,如中所述,创建一个控制台应用程序,摆脱表单和额外的复杂性。然后,让我们看看这两个类是如何交互的。我尝试了这个方法,但在ToList()上出现了一个错误。“Player”不包含“ToList”的定义,并且找不到接受“Player”类型的第一个参数的扩展方法“ToList”(是否缺少using指令或程序集引用?)您是否有
using System.Linq?如果是这样,可能是
.Find()
不是
IEnumerable
。我确实有一个使用系统。LinqI刚刚尝试使用您的第二个系统,我现在在foreach上发现此错误。。。。foreach语句无法对“Interior\u Football\u Manager.Player”类型的变量进行操作,因为“…Player”不包含“GetEnumerator”@RobertCole何谓
getPlayers()
”的公共定义,您需要用该定义更新您的问题
public List<Player> getPlayers
    {
        get
        {
            return listOfPlayers;
        }
        set
        {
            listOfPlayers = value;
        }
    }
using System.Linq;

// ...

public IList<Player> Players
{
    get
    {
        // Assuming that `.Find(...)` returns an `IEnumerable<Player>`
        return f1.getPlayers.Find(p => p.teamid == teamid).ToList()
    }
}
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;
    }
}
public IList<Player> Players
{
    get
    {
        return f1.getPlayers.Where(p => p.teamid == teamid).ToList()
    }
}