我希望更多地了解LINQ并使用它,所以在这里进行一些自我开发工作......
我有一个对象如下:
public class Player(){
public string Name{get;set;}
public Club currentClub{get;set;}
public IEnumerable<Club> previousClubs{get;set;}
}
Run Code Online (Sandbox Code Playgroud)
现在,给出一个球员名单,我想选择以前为各种俱乐部效力的球员,我可以通过嵌套的几个foreach声明轻松地做到这一点 - 但我想用Linq来做. .
我试过这个,但没有从中返回:
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
}
Run Code Online (Sandbox Code Playgroud)
我出错的地方有什么帮助吗?数据肯定是存在的,因为当我有一个环绕循环球员的环绕着球员的foreach循环并且我返回所有为俱乐部1,2和3效力的球员的集合有数据......
实际上它应该返回一个HistoryOfPlayer对象的几个实例,所有实例都包含相同3个俱乐部的名称(假设它们与ID相关联) - 正如我所说,它有点自学,所以试图将它应用于运动所以它我的脑袋里有点!!
有人可以帮忙吗?
你可以让它更有活力
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)
};
Run Code Online (Sandbox Code Playgroud)
在 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)
};
Run Code Online (Sandbox Code Playgroud)
*注意这是在没有 IDE 的情况下编写的,所以我还没有检查它是否有效。