使用linq将IGrouping从一个类转换为另一个类

时间:2011-11-16 07:29:52

标签: c# linq c#-4.0 linq-to-objects

我有两个班级Teams和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 个答案:

答案 0 :(得分:1)

如果您可以更改分组,我只会使用:

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

其中Players.FromPlayerTeamPlayers中的静态方法,它采用PlayerTeam并返回Players

此外,我建议使用ToLookup代替GroupBy - Lookup正是您想要的,而不必费心ToList来电。

答案 1 :(得分:0)

这不是一个想法。

如果您将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();