包含来自int列表

时间:2016-08-04 19:12:09

标签: c# linq-to-sql

我有一个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();

不会返回任何内容。

3 个答案:

答案 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