Return 包含 int 列表中所有 ID 的列表

Return List that Contains All Ids from an int list

我有一个 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 的用户列表。所以在这个例子中我想 return User2 和 User4。我见过其他仅使用 Except 和 return 布尔值的子集示例,即使在适应我的需要时也不会产生正确的结果。我还看到一个标记为重复的 (Similar Question),它正试图这样做,但不同意它是重复的,而且从未真正得到答复。我尝试过:

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

那不会 return 任何东西。

你的问题有点令人费解。您说您想要获取必须包含 IdList 中所有 ID 的用户列表,并且您的预期输出是用户 2 和 4。这没有意义,因为您的 IdList 有 1 和 2。

而且你有不止一条ID为1的记录。User1、User2和User3有相同的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 

好吧,这并不优雅,但有效:

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

使用下面的 1 行 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();

和此代码return User2 和 User4