2016-08-04 74 views
1

包含所有的ID返回列表我有ID的列表:,从一个int列表

var IdList = new int[]{1, 2}; 

我也有用户的列表:

var userList = new List<User>() 
     { 
      new User() {Id = 1, Name = "User1" }, 
      new User() {Id = 1, Name = "User2" }, 
      new User() {Id = 2, Name = "User2" }, 
      new User() {Id = 1, Name = "User3" }, 
      new User() {Id = 1, Name = "User4" }, 
      new User() {Id = 2, Name = "User4" } 
     }; 

我想获得用户的列表必须包含IdList中的所有Id。所以在这个例子中我想返回User2和User4。我已经看到其他子集的例子,只是使用Except和返回布尔值,即使适应我的需要不会产生正确的结果。我也看到一个标记为重复(Similar Question),这是试图做到这一点,但不同意它是一个重复,从来没有真正的答案。我曾尝试过:

userList.Where(u => IdList.All(i => i == u.Id)).ToList(); 

不会返回任何东西。

+0

尝试使用'GroupBy'。 –

+0

为什么你有2个用户使用相同的ID?用户1,用户2和用户3都有Id 1,你的预期结果在你的问题中(所以在这个例子中我想返回User2和User4。)没有任何意义! – Shyju

+1

我同意Shyju。你的数据模型看起来很奇怪。如果您可以控制它,您应该创建具有唯一ID的用户对象。然后将名称属性更改为名称名称(或数组,如果已知,固定长度)。 – Christoph

回答

0

使用娄1LINE LINQ代码。

var q = userList.GroupBy(c => c.Name).Where(c => IdList.All(ccc => userList.Where(cc => cc.Name == c.Key).Any(cc => cc.Id == ccc))).ToList(); 

这个代码回报用户2和用户4

+0

它做到了这一点,是我一直在寻找。我几乎在那里与哪里的声明,但错过了groupby,包括关键。我的模型也更加复杂,但这让我朝着正确的方向前进。谢谢! – user1015196

1

你的问题有点混乱。你说你想获得一个必须包含IdList中所有Id的用户列表,并且你的期望输出是User 2和4.这没有任何意义,因为你的IdList有1和2.

另外你还有更多比ID为1的记录要多。用户1,用户2和用户3具有相同的ID。从此获得一条记录的模式是什么?

假设您没有重复数据,并且您希望基于项目int eh idList的项目子集,则可以使用LINQ Contains方法。

var IdList = new int[]{1, 2}; 
var userList = new List<User>() 
     { 
      new User() {Id = 1, Name = "User1" }, 
      new User() {Id = 2, Name = "User2" }, 
      new User() {Id = 3, Name = "User3" }, 
      new User() {Id = 4, Name = "User4" } 
     }; 
var subSet = userList.Where(d=>IdList.Contains(d.Id); 

//subSet will have records for User1 and User2 
+0

,正如我在另一评论中指出的那样,模型和Id仅仅是一个例子。它可能是一个productId或locationId,所以我只想要包含所有产品或与所有位置关联的用户。你的代码会将任何包含任何Ids的任何内容传入,这不是我正在尝试执行的操作。他们必须与列表中的所有ID关联。希望能为你澄清一下。 – user1015196

0

那么,这是不是优雅,但工作原理:

List<string> result = new List<string>(); 
result = userList.Where(x => x.Id == IdList[0]). 
      Select(x => x.Name).ToList(); 

for(int i =1; i<IdList.Count();i++) 
{ 
    result = userList.Where(x => x.Id == IdList[i]). 
      Select(x => x.Name).ToList(). 
      Intersect(result).ToList(); 
} 
相关问题