我有一个ID列表:
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 :(得分:1)
你的问题有点令人困惑。你说你想获得一个必须包含IdList中所有ID的用户列表,你的预期输出是用户2和4.这没有意义,因为你的IdList有1和2。
此外,您还有一条ID为1的记录.User1,User2和User3具有相同的ID。从中获取一条记录的模式是什么?
假设您没有重复数据,并且您想要基于项目int id的项目子集,您可以使用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
答案 1 :(得分: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();
}
答案 2 :(得分:0)
使用Bellow 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();
此代码返回User2和User4