2011-11-16 61 views
0

我有两个班团队和PlayerTeams转换从一个类IGrouping到另一个使用LINQ

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

我有一个由PlayerTeam这样分组的PlayerTeams列表。 List<IGrouping<string, PlayerTeams>>

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

它,但我希望它是List<IGrouping<string, Players>>类型的,因为我不希望在每个行冗余的关键信息。

我该怎么做到这一点?我只能想到上的.ConvertAll()这样的东西。我也无法做到。

有没有一种有效的方法来做到这一点?

+1

您的'PlayerTeams'类对我来说看起来很奇怪 - 是不是只是一个'Player'和团队名称的组合?为什么你有单独的属性? –

+0

@JonSkeet:我正在修改已经构建的应用程序。这是问题的抽象,我确实拥有不同的道具名称。一个是Linq2SQL类,另一个是之前创建的映射器类。 – naveen

+0

好的 - 当你问这个问题时,值得一提的是那种事情;如果有任何看起来不寻常的东西,最好解释一下。此外,你是否*有*使用现有的分组,或者你是否可以改变分组开始的代码? –

回答

1

如果你可以改变的分组,我只是用:

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

Players.FromPlayerTeamPlayers一个静态方法,这需要PlayerTeam,并返回一个Players

此外,我建议使用的ToLookup代替GroupBy - 一个Lookup正是你想要的这里,不与ToList电话打扰。

+0

好的。我会尝试查找。同样的方法适用于查找转换数据? – naveen

+0

@naveen:是的 - 你可以指定一个键的投影,一个用于元素。 –

+0

明白了。查找对此很快。 (This)[http://msmvps.com/blogs/jon_skeet/archive/2010/12/31/reimplementing-linq-to-objects-part-18-tolookup.aspx]也帮助了我。双倍感谢。 – naveen

0

这不是testet,只是一个想法。

如果你有麻烦您的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();