【问题标题】:Object population with LINQ使用 LINQ 填充对象
【发布时间】:2012-04-30 21:12:07
【问题描述】:

我希望对 LINQ 有更多的了解并更多地使用它,所以在这里进行一些自我开发工作......

我有一个对象如下:

public class Player(){

    public string Name{get;set;}

    public Club currentClub{get;set;}

    public IEnumerable<Club> previousClubs{get;set;}

}

现在,给定一个球员名单,我想选择以前曾为各种选定俱乐部效力的球员,我可以通过嵌套的几个 foreach 语句轻松完成 - 但我想用林克...

我试过了,但没有返回任何东西:

var prevClubs = 
    from player in players
    from clubOriginal in player.previousClubs
    from clubSecond in player.previousClubs
    from clubThird in player.previousClubs
    where clubOriginal.ID == 1
    where clubSecond.ID == 2
    where clubThird.ID == 3
    select new HistoryOfPlayer{ 
        firstClub == clubOriginal.Name,
        secondClub == clubSecond.Name,
        thirdClub == clubThird.Name
    }

对我哪里出错有帮助吗?数据肯定存在,因为当我有一个循环遍历球员的循环内的俱乐部循环时,我返回了为俱乐部 1,2 和 3 效力过的所有球员的集合,有数据......

实际上它应该返回一个 HistoryOfPlayer 对象的几个实例,所有实例都包含相同 3 个俱乐部的名称(假设它们在 ID 上链接) - 正如我所说,它有点自学,所以尝试将它应用到运动,所以它有点卡在我的脑海里!!

有人可以帮忙吗?

【问题讨论】:

标签: c# linq


【解决方案1】:

你可以让它更有活力

List<int> clubIds = new List<int> { 1, 2, 3};
var prevClubs = from player in players
                where player.previousClubs.Any(m => clubIds.Contains(m.ID))
                select new HistoryOfPlayer {
                   Player = player, 
                   Clubs = player.previousClubs
                                 .Where(m => clubIds.Contains(m.ID))
                                 .Select(c => c.Name) 
                };

在 svik 他的评论后编辑:

List<int> clubIds = new List<int> { 1, 2, 3};
var prevClubs = from player in players
                where clubIds.All(id => player.previousClubs
                                              .select(club => club.ID)
                                              .contains(id))
                select new HistoryOfPlayer {
                   Player = player, 
                   Clubs = player.previousClubs
                                 .Where(m => clubIds.Contains(m.ID))
                                 .Select(c => c.Name) 
                };

*注意这是在没有 IDE 的情况下编写的,所以我没有检查它是否有效。

【讨论】:

  • 我不认为这个查询符合要求。原始查询要求在 1、2 3 中的玩家。所以,类似于where clubIds.All(c =&gt; player.PreviousClubs.Contains(c))
  • @svick 是的,就像我说的,我附近没有可以测试的电脑,但你可能是对的
  • @svick 但是应该反过来。我认为一个球员本可以去更多的俱乐部。
  • @chris,你说“谁曾为俱乐部 1,2 和 3 效力过”,答案不包括这个。也许你想说“谁为俱乐部 1,2 或 3 效力过”..
  • @AdrianIftode 我已经对其进行了编辑,因此它会执行 and 而不是 or。
猜你喜欢
  • 1970-01-01
  • 2021-09-24
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多