C # Как я должен собрать данные из объекта в другой экземпляр? - PullRequest
2 голосов
/ 11 апреля 2019

У меня есть основной класс объектов, который содержит данные игрока: имя, счет и команда .У меня есть другой контейнерный класс, в который я помещаю всех этих игроков.Я делаю с ними какие-то действия, например, выясняю, кто набрал наибольшее количество очков и т. Д., И все хорошо, но.Так или иначе, мне нужно составить список всех содержащих команд и подсчитать количество очков, которые есть у каждой команды.Я хотел бы спросить, каковы некоторые методы, чтобы сделать это правильно?Поскольку все игроки, возможно, могут иметь разные команды или одну и ту же команду, поэтому это нужно делать без дубликатов.

Я пытался сделать

private string[] Team;

в своем классе Контейнеров, но понял,что это будет адская работа, а также это сделает мой класс не контейнерным.

Вот как мои классы выглядят как (я помещаю только их части, а не полный класс, потому что я думаю, что тамне нужно) без каких-либо изменений, которые я пробовал:

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];

        }
}

Итак, допустим, у меня есть 2 объекта в моем контейнере.Данные, которые они содержат:

Name    Score    Team
Matt     15      Alfa
Oreo     5       Beta
Bean     7       Alfa

Я хочу, чтобы результаты были:

List of teams and their score:
Alfa     22
Beta      5

1 Ответ

5 голосов
/ 11 апреля 2019

Вот одно решение, которое использует Linq GroupBy и Sum .Я внес небольшие изменения в ваши Player и Container классы, поскольку вы видите (1) List<Player> как хранилище данных вместо Array и (2) открытые свойства в Player class:

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}");
        }
    }
}

Выход:

Alfa 22 
Beta 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...