C#我应该如何从对象到另一个实例收集给定的数据?

Goo*_*ess 2 c# collections class

我的主要对象类别包含玩家数据:姓名,得分和球队。我还有另一个容器类,我把所有这些球员放进去。我和他们一起做一些动作,例如找出谁得分最高等,一切都很好,但是。不知何故,我需要列出所有包含团队的清单,并计算每个团队的分数。我想问一下,有什么方法可以正确地做到这一点?因为所有球员可能都可以拥有不同的球队,也可以拥有同一支球队,所以需要做到没有重复。

我试图使

private string[] Team;
Run Code Online (Sandbox Code Playgroud)

在我的Container类中,但是意识到这将是艰巨的工作,并且这也将使我的类不是容器。

这是我的课程的样子(我只放了一部分而不是完整的课程,因为我认为没有必要),而没有做任何尝试:

class Player
{
        private string name;
        private string team;
        private int score;       
}

class Container
{
        const int Cn = 500;

        private Player[] Pl;

        public int Count { get; set; }

        public Container()
        {
            Count= 0;
            Pl = new Player[Cn];

        }
}
Run Code Online (Sandbox Code Playgroud)

因此,假设我的容器中有2个对象。它们包含的数据是:

Name    Score    Team
Matt     15      Alfa
Oreo     5       Beta
Bean     7       Alfa
Run Code Online (Sandbox Code Playgroud)

我希望结果是:

List of teams and their score:
Alfa     22
Beta      5
Run Code Online (Sandbox Code Playgroud)

Ris*_*o M 5

这是使用Linq GroupBySum的一种解决方案。我对您PlayerContainer类进行了一些修改,您看到(1)List<Player>作为数据存储而不是数组,以及(2)Player类中的公共属性:

class Player
{
    public string Name { get; set; }
    public string Team { get; set; }
    public int Score { get; set; }
}

class Container
{
    private IList<Player> _players;
    public Container()
    {
        _players = new List<Player>();
    }    

    public void Add(Player p) => _players.Add(p);

    public IList<(string Team, int Sum)> GetTeamStats()
    {
        return _players
            .GroupBy(g => g.Team)
            .Select(r => ( Team : r.Key, Sum : r.Sum(s => s.Score)))
            .ToList();
    } 
}

class Program
{
     static void Main(string[] args)
    {
        var cont = new Container();

        cont.Add(new Player { Name = "Matt", Score = 15, Team="Alfa" });
        cont.Add(new Player { Name = "Oreo", Score = 5, Team = "Beta" });
        cont.Add(new Player { Name = "Bean", Score = 7, Team = "Alfa" });

        var teamStats = cont.GetTeamStats();
        foreach (var team in teamStats)
        {
            Console.WriteLine($"{team.Team} {team.Sum}");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Alfa 22 
Beta 5
Run Code Online (Sandbox Code Playgroud)

  • @GoodnightJess如果您打算做超出初学者水平的工作,那么您将学习LINQ是在C#中学习的一项非常基本的技能。我个人更喜欢查询语法 (2认同)