Преобразование IGrouping из одного класса в другой, используя linq - PullRequest
0 голосов
/ 16 ноября 2011

У меня есть два класса команд и PlayerTeams

public class PlayerTeams
{
    public int ID { get; set; }
    public string PlayerName { get; set; }
    public string PlayerCountry { get; set; }
    public bool IsActive { get; set; }

    public string PlayerTeam { get; set; }
}

public class Players
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Country { get; set; }
    public bool? Status { get; set; }
}

У меня есть список PlayerTeams, который сгруппирован по PlayerTeam следующим образом.

var groupedPlayers = teams
            .OrderBy(x => x.PlayerName)
            .GroupBy( x => x.PlayerTeam)
            .ToList();

Это типа List<IGrouping<string, PlayerTeams>>, но я хочу, чтобы он был типа List<IGrouping<string, Players>>, так как я не хочу, чтобы информация о избыточных ключах в каждой строке.

Как я мог этого достичь? Я мог думать только о чем-то вроде .ConvertAll() на IGrouping. Я тоже не могу это сделать.

Есть ли эффективный способ сделать это?

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Если вы можете изменить группировку, я бы просто использовал:

var groupedPlayers = teams
            .OrderBy(x => x.PlayerName)
            .GroupBy(x => x.PlayerTeam, Players.FromPlayerTeam)
            .ToList();

Где Players.FromPlayerTeam - статический метод в Players, который принимает PlayerTeam и возвращает Players.

Кроме того, я бы предложил использовать ToLookup вместо GroupBy - Lookup - это именно то, что вам нужно, не беспокоясь о вызове ToList.

0 голосов
/ 04 февраля 2015

Это не тест, просто идея.

Если у вас возникли проблемы с преобразованием вашего оператора linq, который ожидает тип IGrouping, в список строк, то вы можете иметь выберите раньше.

var groupedPlayers = new List<string>();
groupedPlayers = teams
        .OrderBy(x => x.PlayerName)
        .GroupBy(x => x.PlayerTeam, Players.FromPlayerTeam)
        .Select(x => x.Key) // << added select
        .ToList();
...